【问题标题】:Need py.test to log assert errors in log file from python logging module需要 py.test 在来自 python 日志记录模块的日志文件中记录断言错误
【发布时间】:2012-09-14 10:18:03
【问题描述】:

需要 py.test 在来自 python 日志模块的日志文件中记录断言错误。 该测试设置了 python 日志记录模块,并且所有日志都按预期进行。 我在整个测试中都使用了断言语句。但是当遇到断言错误时, 这些消息不会记录在 python 日志输出中,而是记录在命令控制台中。

有没有办法让 py.test 在测试的日志输出中记录断言错误?

现在错误在命令控制台中,但如果这些断言错误也被记录为 python 日志输出的一部分,这样所有的日志消息都被捕获在一个地方,那就太好了。此外,对于长时间运行的测试,在整个测试完成之前我看不到错误,这可能需要很长时间才能等待。如果我能立即看到断言错误,那就太好了,这样我就可以决定采取行动了。

【问题讨论】:

标签: python assert pytest


【解决方案1】:

如果您想在日志记录中出现 pytest 样式断言错误,可以使用 conftest.py 文件中的 pytest_exception_interact 挂钩:

import logging

def pytest_exception_interact(report):
    logging.error(f'Test exception:\n{report.longreprtext}')

【讨论】:

    【解决方案2】:

    您可以通过在 conftest.py 文件中使用 pytest_runtest_call 挂钩来实现:

    import logging
    
    def pytest_runtest_call(__multicall__):
        try:
            __multicall__.execute()
        except KeyboardInterrupt:
            raise
        except:
            logging.exception('pytest_runtest_call caught exception:')
            raise
    

    pytest_runtest_call 钩子负责实际运行测试函数,但不负责捕获异常并报告它们。这意味着它是捕获异常并将其交给日志记录的理想场所。

    这并没有实际改变调用测试函数的方式,而是使用__multicall__ 来简单地调用如果该钩子不存在则将被调用的钩子。

    请注意,钩子记录的异常会比 py.test 正常报告的异常长得多。这是因为日志不会将堆栈截断为只是测试函数,如果需要,您可以自己添加。

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2011-05-19
      • 2014-10-21
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多