2013-02-12 58 views
1

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

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

theTestObject.doABadThing(); 

assertTrue(theTestObject.hadAnError()); 

targetLogger.setLevel(oldLvl); 

但是这也意味着,如果测试过程中出现不相关的/无意的错误,我不会看到在日志中的信息无论是。

我在这里应该使用最佳做法还是常用模式?如果我可以提供帮助,我不喜欢刺激日志级别,但我也不喜欢在测试输出中产生一堆噪声,这可能会吓到未来的开发人员。

回答

1

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

任何情况下都不应该在单元测试执行日志中出现错误消息。这会使人们习惯日志中的错误并掩盖其他错误。总之,您的选择是:

  1. 最优选:抓住线束中的消息并在其上声明。
  2. 有点好:提高级别并忽略消息。
  3. 不好:不要做任何事情,让日志消息到达stderr/syslog。
+0

好的,我想我以前见过有人做过#1,但是我将不得不为了一些示例代码进行挖掘。就像我说的,我使用的是Log4J,所以如果你发生*有一个方便的链接到一个例子,它将非常感激! – Coderer 2013-02-12 11:23:45

+0

嗯,我刚刚发现[这](http://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a-message-in-a-logger)看起来喜欢它应该做的伎俩。谢谢! – Coderer 2013-02-12 11:28:10

0

我处理这个假设单元测试的的xUnit风格的方式(JUnit中,PyUnit中,等)

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

用做记录的问题是,需要有人去真正分析日志文件,这是耗时且容易出错的。但是,如果生成MyException,测试将通过上面的测试,如果不是,则测试失败。这反过来又允许你自动失败构建,而不是希望测试人员正确地读取日志。

+0

谢谢,我熟悉这个约定,但在我的特殊情况下,扫描日志实际上比这种类型的测试简单得多。如果我在较低级别进行测试,它会起作用,但不幸的是,由于我正在编写一个插件,因此我基本上被集成测试困住了。 – Coderer 2013-02-12 16:30:51

相关问题