pytest:如何在 session 结束时获取所有失败测试的列表? (并且在使用 xdist 时)
pytest: How to get a list of all failed tests at the end of the session? (and while using xdist)
我想要一个所有失败测试的列表,以便在session结束时使用 ].
Pytest 允许您定义一个挂钩 pytest_sessionfinish(session, exitstatus)
,它在 session 的末尾调用,我希望在其中包含该列表。
session
是具有属性 items
(类型 list
)的 _pytest.main.Session
实例,但我找不到每个 item
在该列表中通过或失败。
- 如何在 session 结束时检索所有失败测试的列表?
如何在使用 pytest-xdist
插件时完成,我想在主进程中获取该列表。使用这个插件,session
master 中甚至没有 items
属性:
def pytest_sessionfinish(session, exitstatus):
if os.environ.get("PYTEST_XDIST_WORKER", "master") == "master":
print(hasattr(session, "items")) # False
您可以使用命令行选项--result-log
:
test_dummy.py:
def test_dummy_success():
return
def test_dummy_fail():
raise Exception('Dummy fail')
命令行:
$ py.test --result-log=test_result.txt
test_result.txt
的内容
. test_dummy.py::test_dummy_success
F test_dummy.py::test_dummy_fail
def test_dummy_fail():
> raise Exception('Dummy fail')
E Exception: Dummy fail
test_dummy.py:6: Exception
只需在第一列中搜索 'F',然后是 [file]::[test]
如果你想要测试结果,你可以使用 hook runtest_makereport
:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
if rep.when == 'call' and rep.failed:
mode = 'a' if os.path.exists('failures') else 'w'
try: # Just to not crash py.test reporting
pass # the test 'item' failed
except Exception as e:
pass
--result-log
已弃用。您可以改为使用 -v
来输出测试用例名称,因为它们 运行。如果将其通过管道传输到文件中,则可以查询它。因此,如果您 运行 从脚本中执行测试,您可以执行以下操作:
pytest -v | tee log.txt
grep -E '::.*(FAILURE|ERROR)' log.txt
运行 pytest 与 -rf
让它在最后打印失败测试列表。
来自py.test --help
:
-r chars show extra test summary info as specified by chars
(f)ailed, (E)error, (s)skipped, (x)failed, (X)passed,
(p)passed, (P)passed with output, (a)all except pP.
Warnings are displayed at all times except when
--disable-warnings is set
这是你得到的:
$ py.test -rf
================= test session starts =================
platform darwin -- Python 3.7.2, pytest-4.3.1, py-1.6.0, pluggy-0.7.1
[...]
=============== short test summary info ===============
FAILED test_foo.py::test_foo_is_flar
FAILED test_spam.py::test_spam_is_mostly_pork
FAILED test_eggs.py::test_eggs_are_also_spam
=== 3 failed, 222 passed, 8 warnings in 12.52 seconds ==
我想要一份关于失败测试和参数化变化的简明报告,所以在 conftest.py
中使用 pytest_terminal_summary
:
def pytest_terminal_summary(terminalreporter, exitstatus, config):
terminalreporter.section('Failed tests')
failures = [report.nodeid.split('::')[-1]
for report in terminalreporter.stats.get('failed', [])]
terminalreporter.write('\n'.join(failures) + '\n')
如果您检查 terminalreporter._session.items
,可以将更多信息添加到报告中,这正是我想要的。
我来访问这个问题,试图找出 session
实例的内部数据结构。
迭代 session.items
您可以检查 rep_call.outcome
测试结果的字符串表示形式。
def pytest_sessionfinish(session, exitstatus):
for item in session.items:
print('{} {}'.format(item.name, item.rep_call.outcome))
通过简单的测试用例,你会得到这个
test_positive passed
test_negative failed
您可以仅获取失败测试的详细信息,并使用以下命令将日志保存到文件中。日志还包含每个测试的痕迹。
py.test -rf tests/ | tee logs.txt
我想要一个所有失败测试的列表,以便在session结束时使用 ].
Pytest 允许您定义一个挂钩 pytest_sessionfinish(session, exitstatus)
,它在 session 的末尾调用,我希望在其中包含该列表。
session
是具有属性 items
(类型 list
)的 _pytest.main.Session
实例,但我找不到每个 item
在该列表中通过或失败。
- 如何在 session 结束时检索所有失败测试的列表?
如何在使用
pytest-xdist
插件时完成,我想在主进程中获取该列表。使用这个插件,session
master 中甚至没有items
属性:def pytest_sessionfinish(session, exitstatus): if os.environ.get("PYTEST_XDIST_WORKER", "master") == "master": print(hasattr(session, "items")) # False
您可以使用命令行选项--result-log
:
test_dummy.py:
def test_dummy_success():
return
def test_dummy_fail():
raise Exception('Dummy fail')
命令行:
$ py.test --result-log=test_result.txt
test_result.txt
的内容. test_dummy.py::test_dummy_success
F test_dummy.py::test_dummy_fail
def test_dummy_fail():
> raise Exception('Dummy fail')
E Exception: Dummy fail
test_dummy.py:6: Exception
只需在第一列中搜索 'F',然后是 [file]::[test]
如果你想要测试结果,你可以使用 hook runtest_makereport
:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
if rep.when == 'call' and rep.failed:
mode = 'a' if os.path.exists('failures') else 'w'
try: # Just to not crash py.test reporting
pass # the test 'item' failed
except Exception as e:
pass
--result-log
已弃用。您可以改为使用 -v
来输出测试用例名称,因为它们 运行。如果将其通过管道传输到文件中,则可以查询它。因此,如果您 运行 从脚本中执行测试,您可以执行以下操作:
pytest -v | tee log.txt
grep -E '::.*(FAILURE|ERROR)' log.txt
运行 pytest 与 -rf
让它在最后打印失败测试列表。
来自py.test --help
:
-r chars show extra test summary info as specified by chars
(f)ailed, (E)error, (s)skipped, (x)failed, (X)passed,
(p)passed, (P)passed with output, (a)all except pP.
Warnings are displayed at all times except when
--disable-warnings is set
这是你得到的:
$ py.test -rf
================= test session starts =================
platform darwin -- Python 3.7.2, pytest-4.3.1, py-1.6.0, pluggy-0.7.1
[...]
=============== short test summary info ===============
FAILED test_foo.py::test_foo_is_flar
FAILED test_spam.py::test_spam_is_mostly_pork
FAILED test_eggs.py::test_eggs_are_also_spam
=== 3 failed, 222 passed, 8 warnings in 12.52 seconds ==
我想要一份关于失败测试和参数化变化的简明报告,所以在 conftest.py
中使用 pytest_terminal_summary
:
def pytest_terminal_summary(terminalreporter, exitstatus, config):
terminalreporter.section('Failed tests')
failures = [report.nodeid.split('::')[-1]
for report in terminalreporter.stats.get('failed', [])]
terminalreporter.write('\n'.join(failures) + '\n')
如果您检查 terminalreporter._session.items
,可以将更多信息添加到报告中,这正是我想要的。
我来访问这个问题,试图找出 session
实例的内部数据结构。
迭代 session.items
您可以检查 rep_call.outcome
测试结果的字符串表示形式。
def pytest_sessionfinish(session, exitstatus):
for item in session.items:
print('{} {}'.format(item.name, item.rep_call.outcome))
通过简单的测试用例,你会得到这个
test_positive passed
test_negative failed
您可以仅获取失败测试的详细信息,并使用以下命令将日志保存到文件中。日志还包含每个测试的痕迹。
py.test -rf tests/ | tee logs.txt