给定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
的组合应该足以满足您的用例。