web-dev-qa-db-ja.com

pytestのfixtureとyield_fixtureの違い

私はpytestフィクスチャを使用していますが、以下はかなり似ていますが、最新の作品はかなり似ています。

はい、可読性はyield_fixureの方が優れていますが、正確に何が違うのかを誰かに教えてもらえますか。

以下のような場合、どちらを使用すればよいですか?

@pytest.fixture()
def open_browser(request):
    print("Browser opened")

    def close_browser():
        print("browser closed")

    request.addfinalizer(close_browser)

    return "browser object"

@pytest.yield_fixture()
def open_browser():
    print("Browser opened")
    yield "browser object"
    print("browser closed")


def test_google_search(open_browser):
    print(open_browser)
    print("test_google_search")
18
Gaurang Shah

唯一の違いは読みやすさです。 (100%確実ではありませんが)基本的な動作は同じです(つまり、yieldステートメントがファイナライザとして実行された後のクリーンアップ)。読みやすさのため、私は常に利回りフィクスチャを使用してクリーンアップすることを好みます。

Pytest <3.0を使用している場合でも、その動作を得るにはpytest.yield_fixtureを使用する必要があります。ただし、pytest 3.0以降を使用できる場合は、pytest.yield_fixtureは廃止され、pytest.fixtureを使用して同じyield_fixtureの動作を取得できます。

こちらが 説明ドキュメント です。

Pytest-3.0以降、通常のフィクスチャーデコレーターを使用するフィクスチャーは、yieldステートメントを使用して、以前のバージョンのyield_fixtureとまったく同じように、フィクスチャー値を提供し、分解コードを実行できます。

関数をyield_fixtureとしてマークすることは引き続きサポートされていますが、非推奨であり、新しいコードでは使用しないでください。

15
Frank T

addfinalizerには、歩留まりに対して2つの重要な違いがあります。

  1. 複数のファイナライザ関数を登録することが可能です。
  2. フィクスチャセットアップコードで例外が発生したかどうかに関係なく、ファイナライザは常に呼び出されます。これは、フィクスチャによって作成されたすべてのリソースを、それらの1つが作成/取得に失敗した場合でも適切に閉じるのに便利です。

から pytest docs

5
yugal sinha