Pytest:立即在活动日志中打印traceback,而不是在总结的最后



给定test.py

import logging
log = logging.getLogger("mylogger")
def test():
log.info("Do thing 1")
log.info("Do thing 2")
raise Exception("This is deeply nested in the code")
log.info("Do thing 3")
assert True
def test_2():
log.info("Nothing interesting here")

当我运行pytest --log-cli-level NOTSET test.py时,我得到输出

======================= test session starts ========================
platform win32 -- Python 3.9.4, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:workscrapspython-test-scraps
collected 2 items                                                   
test.py::test_1
-------------------------- live log call ---------------------------
INFO     mylogger:test.py:6 Do thing 1
INFO     mylogger:test.py:7 Do thing 2
FAILED                                                        [ 50%]
test.py::test_2
-------------------------- live log call ---------------------------
INFO     mylogger:test.py:13 Nothing interesting here
PASSED                                                        [100%]
============================= FAILURES =============================
______________________________ test_1 ______________________________
def test_1():
log.info("Do thing 1")
log.info("Do thing 2")
>       raise Exception("This is deeply nested in the code")
E       Exception: This is deeply nested in the code
test.py:8: Exception
------------------------ Captured log call -------------------------
INFO     mylogger:test.py:6 Do thing 1
INFO     mylogger:test.py:7 Do thing 2
===================== short test summary info ======================
FAILED test.py::test_1 - Exception: This is deeply nested in the code
=================== 1 failed, 1 passed in 0.07s ====================

我发现这种输出格式非常令人困惑,特别是对于较大的测试套件。当我遵循日志并看到FAILED时,我必须跳到日志的后半部分并搜索相应的FAILURE或ERROR。

我想更改pytest的输出,以便在发生相应事件时立即打印(所谓的)摘要,以便可以按时间顺序读取输出,而不必跳转。

到目前为止,我只找到了一种禁用摘要的方法。pytest --log-cli-level NOTSET --no-summary test.py打印…
======================= test session starts ========================
platform win32 -- Python 3.9.4, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:workscrapspython-test-scraps
collected 2 items                                                   
test.py::test_1
-------------------------- live log call ---------------------------
INFO     mylogger:test.py:6 Do thing 1
INFO     mylogger:test.py:7 Do thing 2
FAILED                                                        [ 50%]
test.py::test_2
-------------------------- live log call ---------------------------
INFO     mylogger:test.py:13 Nothing interesting here
PASSED                                                        [100%]
=================== 1 failed, 1 passed in 0.06s ====================

这在某种程度上更好,但也更糟,因为缺少跟踪。
是否有官方的方式来打印实时日志调用中的跟踪?

我不知道是不是">官方"或者没有,但我确实在Pytest开发论坛中找到了这个答案,建议使用Pytest -instafail。它是一个维护插件,所以它可以做你想做的事情。它满足了我的需要;现在我可以在实时日志输出中看到回溯,而不必等到测试套件结束时才看到哪里出了问题。

要按原来的顺序只打印一次日志、失败和错误,请运行…

pytest --log-cli-level NOTSET --instafail --show-capture no --no-summary
  • --instafail启用插件。
    pytest默认加载它,但插件本身默认不做任何事情。
  • --show-capture no禁止在发生错误后打印日志
    如果不这样做,您将在发生错误时打印两次日志:一次在错误之前(因为--log-cli-level NOTSET),一次在错误之后(就像pytest通常做的那样)。

插件仍然先打印traceback,然后再打印捕获的日志,这违背了您按原始顺序打印所有内容的目标。但是由于您已经在使用--log-cli,因此与--show-capture no的组合应该足以满足您的用例。

相关内容

  • 没有找到相关文章

最新更新