У меня есть собственный декоратор на моих тестах, который просто дает дополнительную информацию для теста. Я бы хотел, чтобы при тестировании я смог распечатать часть этой информации и показать ее в разделе сбоев, поэтому наши инструменты сборки могут хорошо отображать ее.
Прямо сейчас у меня есть код, который выглядит так:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
if outcome.get_result().outcome != "passed":
print("Some extra info: {}".format(item.function.detail1))
Проблема в том, что это при неудачном тестировании я получаю вывод, который выглядит так:
test_foo.py .Some extra info: more info
F
================================== FAILURES ===================================
__________________________________ test_foo2 __________________________________
@info("more info")
def test_foo():
> raise ValueError("OH NO")
E ValueError: OH NO
test_foo.py:11: ValueError
Мне нужна Some extra info: more info
для показа в этом нижнем разделе. Можно ли это как-то зацепиться?
Здесь быстрое рабочее решение, хотя я уверен, что есть, вероятно, больше (тестовый) тонкий способ сделать это.
test.py
def test_fail():
assert False
def test_pass():
assert True
def test_fail_2():
assert False
conftest.py
import pytest
FAIL_EXTRA_INFO = []
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
if outcome.get_result().outcome != "passed":
FAIL_EXTRA_INFO.append("Some extra info: {}".format(item))
def pytest_terminal_summary(terminalreporter, exitstatus):
for extra_info in FAIL_EXTRA_INFO:
print(extra_info)
Результат выполнения:
$ pytest -v
======================== test session starts =======================
platform linux -- Python 3.7.0, pytest-3.6.2, py-1.5.4, pluggy-0.6.0
-- /home/user/.virtualenvs/test3.7/bin/python3.7
cachedir: .pytest_cache
rootdir: /home/user/projects/so, inifile:
collected 3 items
so/test_api.py::test_fail FAILED [ 33%]
so/test_api.py::test_pass PASSED [ 66%]
so/test_api.py::test_fail_2 FAILED [100%]
============================== FAILURES ============================
______________________________ test_fail ___________________________
def test_fail():
> assert False
E assert False
slotr_tracker/test_api.py:2: AssertionError
_____________________________ test_fail_2 _________________________
def test_fail_2():
> assert False
E assert False
slotr_tracker/test_api.py:10: AssertionError
Some extra info: <Function 'test_fail'>
Some extra info: <Function 'test_fail_2'>
================ 2 failed, 1 passed in 0.03 seconds ===============
Здесь ссылка pytest hooks, если вы хотите углубиться в предмет.