是的,我们应该在日志记录执行所需的操作时测试日志记录。例如,您在某些外部应用程序中有钩子,用于扫描日志以查找某些事件。在这种情况下,您当然希望确保日志记录已完成。
当然,您不想测试每个日志事件,我认为大多数情况下应该只测试 ERROR(而不是全部)。
使用现代日志框架(例如 SLF4j),您可以简单地注入一个自定义处理程序,将事件存储在内存中,然后可以对其进行断言。
我现在想到的有两个:
SLF4JTesting:不需要修改日志配置,但需要注入可能导致修改代码的日志工厂。
SLF4J 测试:不如 slf4jtesting 强大,似乎还没有开发,但与现有代码配合得很好。除了用于测试的记录器配置外,没有任何修改。
使用 SLF4J 测试时,断言非常严格并检查整个事件是否相等。在这种情况下,自定义匹配器可能很有趣:
public static Matcher<LoggingEvent> errorMessageContains(final String s) {
return new TypeSafeMatcher<LoggingEvent>() {
@Override
public void describeTo(final Description description) {
description.appendText(" type " + Level.ERROR + " should contain ")
.appendValue(s);
}
@Override
protected void describeMismatchSafely(final LoggingEvent item, final Description mismatchDescription) {
mismatchDescription.appendText(" was type ").appendValue(l)
.appendText(" message ").appendValue(item.getMessage());
}
@Override
protected boolean matchesSafely(final LoggingEvent item) {
return item.getLevel().equals(Level.ERROR)
&& item.getMessage().contains(s);
}
};
}
这仅检查消息是否包含文本,但不检查是否相等。因此,当修改消息以修复错字或提供更多细节时,如果仍然包含基本部分,则测试不会中断。