问题描述
取决于 pytest
测试运行的整体测试结果,我想执行有条件的拆卸.这意味着必须在执行完所有测试之后但在离开测试运行器之前访问整体测试结果.我怎样才能做到这一点?
Dependent on the overall test result of a pytest
test run I would like to execute conditional tear down. This means the access to the overall test result must happen after all tests have been executed but before the test runner has been left. How can I achieve this?
推荐答案
你不需要一个;只需自己收集测试结果.这是我在需要批量访问测试结果时常用的蓝图:
You don't need one; just collect the test results yourself. This is the blueprint I usually use when in need of accessing the test results in batch:
# conftest.py
import pytest
def pytest_sessionstart(session):
session.results = dict()
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
result = outcome.get_result()
if result.when == 'call':
item.session.results[item] = result
现在所有的测试结果都存储在session.results
dict下;示例用法:
Now all test results are stored under session.results
dict; example usage:
# conftest.py (continued)
def pytest_sessionfinish(session, exitstatus):
print()
print('run status code:', exitstatus)
passed_amount = sum(1 for result in session.results.values() if result.passed)
failed_amount = sum(1 for result in session.results.values() if result.failed)
print(f'there are {passed_amount} passed and {failed_amount} failed tests')
运行测试将产生:
$ pytest -sv
================================== test session starts ====================================
platform darwin -- Python 3.6.4, pytest-3.7.1, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-51711988, inifile:
collected 3 items
test_spam.py::test_spam PASSED
test_spam.py::test_eggs PASSED
test_spam.py::test_fail FAILED
run status code: 1
there are 2 passed and 1 failed tests
======================================== FAILURES =========================================
_______________________________________ test_fail _________________________________________
def test_fail():
> assert False
E assert False
test_spam.py:10: AssertionError
=========================== 1 failed, 2 passed in 0.05 seconds ============================
如果整体 pytest
退出代码 (exitstatus
) 有足够的信息(关于#passed、# failed 等的信息不需要),请使用以下内容:>
In case the overall pytest
exit code (exitstatus
) is sufficient info (info about # passed, # failed, etc. not required) use the following:
# conftest.py
def pytest_sessionfinish(session, exitstatus):
print()
print('run status code:', exitstatus)
访问错误
您可以从 call.excinfo
对象访问错误详细信息:
Accessing the error
You can access the error details from the call.excinfo
object:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
result = outcome.get_result()
if result.outcome == "failed":
exception = call.excinfo.value
exception_class = call.excinfo.type
exception_class_name = call.excinfo.typename
exception_type_and_message_formatted = call.excinfo.exconly()
exception_traceback = call.excinfo.traceback
这篇关于如何在运行时访问 pytest 测试运行的整体测试结果?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!