8

pytest_runtest_makereport() は item と call の 2 つの引数を取得します。item から、このテスト用に作成した funcarg を見つけることができ、call から、例外情報 (存在する場合) を見つけることができます。

def pytest_runtest_makereport (item, call):
    my_funcarg = item.funcargs['name']
    my_funcarg.excinfo = call.excinfo

残念ながら、excinfo には失敗とスキップの両方が含まれています。区別するには、pytest_report_teststatus() のレポート引数を確認する必要があります。

def pytest_report_teststatus (report):
    if report.when == 'call':
        if report.failed:
            failed = True
        elif report.skipped:
            skipped = True
        else:
            passed = True

これは素晴らしい情報ですが、テスト用に作成した funcarg と関連付けることはできません。レポートの引数 (TestReport レポート) を調べましたが、pytest_runtest_makereport() に渡されたアイテム、または作成した funcarg に戻る方法が見つかりません。

両方にアクセスできる場所はどこですか?

4

2 に答える 2

5

フックの実装が他のフックの実装とやり取りできる、ドキュメント化されていないやや非公式な方法があります。たとえば、結果の後処理などです。あなたの具体的なケースでは、次のようなことをするかもしれません:

@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
    rep = __multicall__.execute()
    # your code follows and you can use rep.passed etc.
    return rep

ノート:

  • フック呼び出しは通常、複数のフック実装を呼び出します
  • 「tryfirst」マーカーは、実装が早期に呼び出されるようにフック呼び出しに指示します
  • multicallパラメータは進行中のフック呼び出しを表し、残りのフック実装を呼び出すために
    使用でき、その後の処理のためにそれらの結果を使用できます
  • 「実際の」作成をシャドウするため、ここで「rep」を返す必要があります

マルチコールAPI が実際に使用されることはめったになく、それを必要としないユース ケースのソリューションがあるのではないかと思います。

HTH、ホルガー

于 2012-05-29T20:44:52.680 に答える