web-dev-qa-db-ja.com

pytest:セッションの最後に失敗したすべてのテストのリストを取得するにはどうすればよいですか? (そしてxdistを使用している間)

失敗したすべてのテストのリストを使用したいセッション終了時.

Pytestを使用すると、セッションの最後に呼び出されるフックpytest_sessionfinish(session, exitstatus)を定義できます。このリストが必要です。

sessionは、属性items(タイプlist)を持つ_pytest.main.Sessionインスタンスですが、それぞれのitemが渡されたそのリストは失敗しました。

  1. セッションの最後に、失敗したすべてのテストのリストを取得するにはどうすればよいですか?
  2. pytest-xdistプラグインを使用しているときに、マスタープロセスでそのリストを取得する方法を教えてください。このプラグインを使用すると、sessionにはマスターにitems属性さえありません。

    def pytest_sessionfinish(session, exitstatus):
        if os.environ.get("PYTEST_XDIST_WORKER", "master") == "master":
             print(hasattr(session, "items"))  # False
    
14
Itay

テストの結果が必要な場合は、フック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

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

コマンドラインオプション--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]になります。

5
ANDgineer

--result-logは非推奨です。代わりに、-vを使用して、実行時にテストケース名を出力できます。それをファイルにパイプすると、クエリを実行できます。したがって、スクリプトからテストを実行している場合は、次のようなことができます。

pytest -v | tee log.txt
grep -E '::.*(FAILURE|ERROR)' log.txt
3
z0r

失敗したテストとパラメーター化されたバリエーションの簡潔なレポートが必要だったので、pytest_terminal_summary in 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、レポートに追加できる情報が他にもあります。これがまさに私が欲しかったものです。

1
Joao Coelho