我想为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/