【问题标题】:How to globally configure logging for unit tests when executing them in discovery mode?在发现模式下执行单元测试时,如何为单元测试全局配置日志记录?
【发布时间】:2020-03-10 23:32:30
【问题描述】:

在我的python包中,我使用标准模块logging创建日志,使用unittest创建单元测试。

由于包含单元测试的文件分布在包的整个文件夹结构中,我使用测试发现模式来执行单元测试:

python -m unittest discover \
       --pattern "*_test.py" \
       --start-directory "path/to/package/root"

不幸的是,这会导致控制台上的文本流混乱,因为来自单元测试运行器的日志消息和输出都被转发到stdout

对于单个测试模块(我将其存储在单独的文件 <module_name>_test.py 中),我通常在 __main__-block 中全局控制日志输出:

# In <module_name>_test.py

import logging
import unittest
# ...

if __name__ == "__main__":
    # Forward log messages into a file test.log.
    logging.basicConfig(level=logging.DEBUG,
                        filename="testing/output/test.log")
    unittest.main()

在执行python &lt;module_name&gt;_test.py 时,这可以确保日志消息与单元测试输出分开。

但是,在测试发现模式下,我的测试模块的 __main__-blocks 永远不会执行。因此我的问题是:如何在测试发现模式下全局设置日志记录?理想情况下,我只需要在一个地方配置记录器,而不是在所有测试模块中单独配置。这可能吗?

【问题讨论】:

    标签: python unit-testing logging


    【解决方案1】:

    在仔细阅读unittest discovery 上的文档后,解决方案相对简单。该功能在TestLoader.discover() 中实现。

    为了运行所有单元测试,我编写了一个文件run_tests.py,如下所示:

    import logging
    import unittest
    
    if __name__ == "__main__":
        logging.basicConfig(level=logging.DEBUG,
                            filename="test.log")
        loader = unittest.TestLoader()
        tests = loader.discover(pattern="*_test.py",
                                start_dir="<path/to/package>")
        runner = unittest.runner.TextTestRunner()
        runner.run(tests)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2011-05-21
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多