我希望在会话结束时使用 >> 列出已失败的所有测试。
Pytest允许你定义一个钩子pytest_sessionfinish(session, exitstatus)
,它在会话结束时被调用,我想拥有该列表。
session
是_pytest.main.Session
个实例,其属性为items
(类型list
),但我无法找到每个item
在该列表中通过失败。
使用pytest-xdist
插件时如何才能完成,我希望在主进程中获取该列表。使用此插件,session
在主控版中甚至没有items
属性:
def pytest_sessionfinish(session, exitstatus):
if os.environ.get("PYTEST_XDIST_WORKER", "master") == "master":
print(hasattr(session, "items")) # False
答案 0 :(得分:3)
您可以使用命令行选项--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]
中搜索答案 1 :(得分:2)
如果您想要测试结果,可以使用hook A
:
runtest_makereport
答案 2 :(得分:1)
--result-log
已过时。您可以改为使用-v
在测试用例名称运行时输出它们。如果将其通过管道传输到文件中,则可以对其进行查询。因此,如果您正在通过脚本运行测试,则可以执行以下操作:
pytest -v | tee log.txt
grep -E '::.*(FAILURE|ERROR)' log.txt
答案 3 :(得分:1)
使用-rf
运行pytest使其在末尾打印失败的测试列表。
来自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 ==
答案 4 :(得分:1)
您可以获取仅失败测试的详细信息,并使用以下命令将日志保存到文件中。日志还包含每次测试的痕迹。
py.test -rf tests/ | tee logs.txt
答案 5 :(得分:0)
我想要一份关于失败测试和参数化变化的简明报告,所以在pytest_terminal_summary
中使用conftest.py
:
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
,则可以将更多信息添加到报告中,这正是我想要的。
答案 6 :(得分:-1)
我来回答这个问题,试图找出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