我有一个创建错误条件的单元测试。通常,被测试的类会将此错误写入日志(在这种情况下使用log4j,但我认为这并不重要)。我可以使用
临时更改日志级别Logger targetLogger = Logger.getLogger(ClassUnderTest.class);
Level oldLvl = targetLogger.getLevel();
targetLogger.setLevel(Level.FATAL);
theTestObject.doABadThing();
assertTrue(theTestObject.hadAnError());
targetLogger.setLevel(oldLvl);
但这也意味着如果在测试期间发生无关/无意的错误,我也不会在日志中看到这些信息。
我应该在这里使用最佳实践或常用模式吗?如果我可以帮助它,我不喜欢刺激日志级别,但我也不喜欢在测试输出中有一堆ERROR
噪音,这可能会吓到未来的开发人员。
答案 0 :(得分:1)
如果您的日志记录层允许,最好对错误消息进行断言。您可以通过实现自己的记录器来实现它,该记录器只对消息进行断言(无输出),或者使用内存缓冲记录器,然后检查日志缓冲区的内容。
在任何情况下,错误消息都不应该在单元测试执行日志中结束。这将导致人们习惯于在日志中出错并掩盖其他错误。简而言之,您的选择是:
答案 1 :(得分:0)
我采用XUnit样式进行单元测试(Junit,Pyunit等)的方法
@Test(expected = MyException)
foo_1() throws Exception
{
theTestObject.doABadThing(); //MyException here
}
执行日志记录的问题是有人需要去实际解析日志文件,这非常耗时且容易出错。但是,如果生成MyException
,则测试将在上面通过,如果不生成则将失败。这反过来允许您自动失败构建,而不是希望测试人员正确读取日志。