如何检查用于日志记录的处理程序?

时间:2018-06-14 11:32:37

标签: python python-unittest functional-testing

我正在为我的Python应用程序编写功能测试。我在我测试的代码中使用Python标准日志包。在我的单元测试中,我已经模拟了日志包,但是对于功能测试,我想测试两件事:

  1. 日志格式正确 - 我可以查看这个 -
  2. 日志被发送到stdout - 这是我有点迷失的地方 -
  3. 我能够捕获日志并检查消息是否正确。这是我正在使用的代码:

    with assertLogs('', level='INFO') as captured_logs:
        do_something()
        assertEqual(captured_logs.records[0].msg, "expected message")
    

    这样可以正常工作,但我只测试我的第1点,生成日志并且消息符合预期。

    我的问题是如何测试这些日志实际上是发送到stdout而不是文件或stderr等?

    修改

    要测试的代码示例可以是

    import logging    
    
    def do_something():
        logging.warning("expected message")
    

    测试代码的结果将是测试通过,因为记录的消息是预期的消息。但无论日志是转到文件,还是转移到sys.stdoutsys.stderr,它都会通过......我的问题是我需要添加到测试代码中以确保仅测试当日志消息进入stdout时传递

    谢谢!

1 个答案:

答案 0 :(得分:1)

检查根记录器的处理程序,以验证StreamHandler(在控制台上登录的处理程序)是否是唯一的记录器。

例如:

from logging import getLogger, StreamHandler

root_logger = getLogger('')
assert len(root_logger.handlers) == 1
assert isinstance(root_logger.handlers[0], StreamHandler)