【问题标题】:Testing logger Messages with unittest使用 unittest 测试记录器消息
【发布时间】:2018-05-23 15:49:18
【问题描述】:

我想在我的单元测试中测试记录器消息而不将它们打印到屏幕上。鉴于此代码:

 import logging
 logging.basicConfig(level=logging.ERROR)
 logger = logging.getLogger('test')
 logger.warning('this is a warning')

 # How do I see that there was a warning?

如何查看记录器中的日志记录以查看是否有警告?我在 Logger 中找不到可以完成这项工作的迭代器。

【问题讨论】:

    标签: python logging python-unittest


    【解决方案1】:

    在这种情况下,您可能需要使用TestCase.assertLogs() 上下文管理器。该文档提供了一个很好的例子来说明可以用它做什么:

    with self.assertLogs('foo', level='INFO') as cm:
       logging.getLogger('foo').info('first message')
       logging.getLogger('foo.bar').error('second message')
    self.assertEqual(cm.output, ['INFO:foo:first message',
                                 'ERROR:foo.bar:second message'])
    

    在上下文管理器中,您可以访问 cm.records 获取 LogRecord 实例列表,或访问 cm.output 获取格式化消息列表

    【讨论】:

    • 这是完美的。谢谢!
    • 请参阅stackoverflow.com/a/29938398/498463 以获得与此等效的 python 2.7 兼容
    • 我必须放弃 'foo' 参数才能使我的测试正常工作。如 '''with self.assertLogs(level='INFO') as cm:'''
    • @mb_atx 'foo' 显然是一个示例名称...您必须用自己的名称替换。在您的情况下,删除参数将从 RootLogger (也就是所有日志)中捕获日志。它有效,但断言可能过于宽泛。使用应该发送日志消息的记录器的名称进行过滤,您将完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2012-06-15
    • 2016-06-04
    • 1970-01-01
    • 2017-06-25
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多