Je voudrais avoir un liste de tous les tests qui ont échoué à utiliser à la fin de la session.
Pytest vous permet de définir un hook pytest_sessionfinish(session, exitstatus)
, qui est appelé à la fin de la session, où je souhaite avoir cette liste.
session
est un _pytest.main.Session
instance qui a l'attribut items
(tapez list
), mais je n'ai pas pu déterminer si chaque item
de cette liste est passé ou non.
Comment le faire en utilisant pytest-xdist
plugin, où je voudrais obtenir cette liste dans le processus maître. En utilisant ce plugin, session
n'a même pas d'attribut items
dans le maître:
def pytest_sessionfinish(session, exitstatus):
if os.environ.get("PYTEST_XDIST_WORKER", "master") == "master":
print(hasattr(session, "items")) # False
Si vous voulez les résultats des tests, vous pouvez utiliser 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
Exécutez pytest avec -rf
pour obtenir à la fin l'impression d'une liste de tests ayant échoué.
De 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
Voici ce que vous obtenez:
$ 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 ==
Vous pouvez utiliser l'option de ligne de commande --result-log
:
test_dummy.py:
def test_dummy_success():
return
def test_dummy_fail():
raise Exception('Dummy fail')
Ligne de commande:
$ py.test --result-log=test_result.txt
Contenu du 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
Recherchez simplement 'F' dans la première colonne et après cela serait [file] :: [test]
--result-log
est obsolète. Vous pouvez utiliser à la place -v
pour afficher les noms des scénarios de test lors de leur exécution. Si vous canalisez cela dans un fichier, vous pouvez l'interroger. Donc, si vous exécutez vos tests à partir d'un script, vous pouvez faire quelque chose comme:
pytest -v | tee log.txt
grep -E '::.*(FAILURE|ERROR)' log.txt
Je voulais un rapport concis des tests échoués et des variations paramétrées, alors je suis allé avec pytest_terminal_summary
dans 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')
Si vous inspectez terminalreporter._session.items
, il y a plus d'informations que vous pouvez ajouter au rapport, c'est exactement ce que je voulais.