web-dev-qa-db-fra.com

pytest: Comment obtenir une liste de tous les tests ayant échoué à la fin de la session? (et en utilisant xdist)

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.

  1. Comment récupérer une liste de tous les tests ayant échoué à la fin de la session?
  2. 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
    
14
Itay

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
4
ANDgineer

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 ==
16
Aaron V

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]

5
ANDgineer

--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
3
z0r

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.

1
Joao Coelho