2

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

Logger targetLogger = Logger.getLogger(ClassUnderTest.class);
Level oldLvl = targetLogger.getLevel();
targetLogger.setLevel(Level.FATAL);

theTestObject.doABadThing();

assertTrue(theTestObject.hadAnError());

targetLogger.setLevel(oldLvl);

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

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

4

2 回答 2

1

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

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

  1. 最优选:捕捉线束中的消息并对其进行断言。
  2. 还可以:提高级别并忽略该消息。
  3. 不行:不要做任何事情,让日志消息到达 stderr/syslog。
于 2013-02-12T11:18:57.667 回答
0

假设 XUnit 风格的单元测试(Junit、Pyunit 等),我处理这个问题的方式

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

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

于 2013-02-12T14:36:09.023 回答