如果它应该产生错误,我应该更改单元测试的日志级别吗?

时间:2013-02-12 11:15:51

标签: unit-testing logging

我有一个创建错误条件的单元测试。通常,被测试的类会将此错误写入日志(在这种情况下使用log4j,但我认为这并不重要)。我可以使用

临时更改日志级别
Logger targetLogger = Logger.getLogger(ClassUnderTest.class);
Level oldLvl = targetLogger.getLevel();
targetLogger.setLevel(Level.FATAL);

theTestObject.doABadThing();

assertTrue(theTestObject.hadAnError());

targetLogger.setLevel(oldLvl);

但这也意味着如果在测试期间发生无关/无意的错误,我也不会在日志中看到这些信息。

我应该在这里使用最佳实践或常用模式吗?如果我可以帮助它,我不喜欢刺激日志级别,但我也不喜欢在测试输出中有一堆ERROR噪音,这可能会吓到未来的开发人员。

2 个答案:

答案 0 :(得分:1)

如果您的日志记录层允许,最好对错误消息进行断言。您可以通过实现自己的记录器来实现它,该记录器只对消息进行断言(无输出),或者使用内存缓冲记录器,然后检查日志缓冲区的内容。

在任何情况下,错误消息都不应该在单元测试执行日志中结束。这将导致人们习惯于在日志中出错并掩盖其他错误。简而言之,您的选择是:

  1. 最喜欢:抓住线束中的消息并在其上断言。
  2. 稍微好一点:提高等级并忽略该消息。
  3. 不行:不做任何事情,让日志消息到达stderr / syslog。

答案 1 :(得分:0)

我采用XUnit样式进行单元测试(Junit,Pyunit等)的方法

@Test(expected = MyException)  
 foo_1() throws Exception
{
    theTestObject.doABadThing(); //MyException here
}

执行日志记录的问题是有人需要去实际解析日志文件,这非常耗时且容易出错。但是,如果生成MyException,则测试将在上面通过,如果不生成则将失败。这反过来允许您自动失败构建,而不是希望测试人员正确读取日志。