我想为1个单元测试关闭日志记录(这不会失败),因此stacktrace不会显示在日志中。该堆栈跟踪应该在生产运行中存在,因为它是一个失败测试测试。

生产代码如下所示:

boolean failed = false;
for (int i = 0; i < 10; i++) {
    try {
        // Possible submits on Executor to run on other thread (not that it matters)
        runTask(i);
    } catch (RuntimeException e) {
        // In the unit test, this pollutes the test log // BAD, MY PROBLEM
        // In production, it shows up in the log immediately, before other tasks run // GOOD
        logger.warn("Task failed. Stacktrace:", e);
        failed = true;
    }
}
if (failed) {
    // The unit test checks if this exception is thrown,
    // (it doesn't pollute the test log)
    throw new IllegalStateException("at least 1 failed");
    // In the real implementation, this also chains the first exception, to avoid eating the stacktrace
}

我有一个单元测试,它测试如果执行器提交的10个任务中至少有1个失败,则执行者将引发异常。因为执行程序在发生内部异常时不会失败,所以它在抛出外部异常之前先运行其他任务。因此,当它捕获内部异常时,将其记录下来,并在日志中给出一个堆栈跟踪。对于QA,这是令人误解的,因为尽管所有测试均成功,但测试日志显示了堆栈跟踪。我想摆脱测试日志(jira)中的该堆栈跟踪。

最佳答案

这听起来很琐碎,但是您是否考虑过将日志记录调用放入if-then块中?

我很确定您以某种方式将环境标识符传递给您的应用程序(例如,作为环境变量)。现在,只需几分钟即可使用静态方法创建实用程序类,该方法可确定当前环境是否为测试环境。

假设您可以将环境标识符作为环境变量来访问,那么我将使用类似的方法:

public class EnvironmentInfo {

     private static final ENVIRONMENT_IDENTIFIER_PARAMETER = "env";
     private static final Set<String> TEST_ENVIRONMENTS = ImmutableSet.of("test"); // this requires Guava

     public static boolean isTestEnvironment() {
         return TEST_ENVIRONMENTS.contains(System.getProperty(ENVIRONMENT_IDENTIFIER_PARAMETER));
     }

}

当您登录时,您只需选择:
if (!EnvironmentInfo.isTestEnvironment()) {
    logger.warn("Task failed. Stacktrace:", e);
}

关于java - Slf4j或Logback : Turn off logging for 1 unit test (or 1 thread),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28807545/

10-10 23:15