4

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

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

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

4

2 回答 2

7

您可以通过在 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 正常报告的异常长得多。这是因为日志记录不会将堆栈截断为只是测试函数,如果需要,您可以自己添加它。

于 2012-09-22T21:22:11.870 回答
1

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

import logging

def pytest_exception_interact(report):
    logging.error(f'Test exception:\n{report.longreprtext}')
于 2021-09-24T11:33:54.560 回答