【问题标题】:Should I change the log level of my unit test if it's supposed to produce an error?如果应该产生错误,我应该更改单元测试的日志级别吗?
【发布时间】:2013-01-27 16:22:58
【问题描述】:

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

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

theTestObject.doABadThing();

assertTrue(theTestObject.hadAnError());

targetLogger.setLevel(oldLvl);

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

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

【问题讨论】:

    标签: unit-testing logging


    【解决方案1】:

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

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

    1. 最优选:捕捉线束中的消息并对其进行断言。
    2. 还可以:提高级别并忽略该消息。
    3. 不正常:什么都不做,让日志消息到达 stderr/syslog。

    【讨论】:

    • 好的,我想我以前见过有人做#1,但我将不得不挖掘一下示例代码。就像我说的,我正在使用 Log4J,所以如果您碰巧有一个方便的示例链接,将不胜感激!
    • 啊,我刚刚找到了this,看起来应该可以解决问题。谢谢!
    【解决方案2】:

    我采用 XUnit 风格的单元测试(Junit、Pyunit 等)来处理这个问题

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

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

    【讨论】:

    • 谢谢,我熟悉这种约定,但在我的特殊情况下,扫描日志实际上比这种类型的测试要简单得多。如果我在较低级别进行测试,它会起作用,但不幸的是,考虑到我正在为其编写插件的应用程序,我基本上坚持进行集成测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多