web-dev-qa-db-ja.com

pytestフィクスチャはどの順序で実行されますか?

テストしているアプリケーションの場合、予期せず電子メールを送信しようとした場合にテストに失敗するようにautouse=Trueをmonkeypatchするsmtplib.SMTP.connectフィクスチャを作成したいと思います。

ただし、テストでメールを送信することが予想される場合は、代わりにそれらのメールをログに記録する別のフィクスチャを使用します(おそらく、pytest-localserversmtpserverフィクスチャを使用し、connectそのフィクスチャによって返されるホスト/ポートを使用するメソッド)

もちろん、これは、自動使用フィクスチャが他のフィクスチャ(funcargとしてロードされる)の前に実行された場合にのみ機能します。フィクスチャが実行される特定の順序はありますか、および/または実行順序を保証する方法はありますか?

20
ThiefMaster

フィクスチャが実行される順序を制御する最も簡単な方法は、後のフィクスチャで前のフィクスチャを要求することです。したがって、baの前に実行されることを確認するには:

@pytest.fixture(autouse=True, scope="function")
def b():
    pass

@pytest.fixture(scope="function")
def a(b):
    pass
19
Chronial

私はちょうど2つのfunctionスコープの自動使用フィクスチャでこの問題を抱えていました。フィクスチャbをフィクスチャaの前に実行したかったのですが、毎回aが最初に実行されました。アルファベット順かもしれないと思ったので、aの名前をcに変更すると、bが最初に実行されます。 Pytestはこれを文書化していないようです。幸運な推測でした。 :-)

それは自動使用器具用です。より広いスコープ(例:modulesession)を考慮すると、pytestがそれを必要とするテストに遭遇すると、フィクスチャが実行されます。したがって、2つのテストがあり、最初のテストでsessionという名前のフィクスチャではなくsbという名前のsaスコープのフィクスチャを使用する場合、sbは次のようになります。最初に実行されます。次のテストが実行されると、saが必要であると想定して、saが開始されます。

8
ebeezer

IIRCでは、スコープの高いフィクスチャを最初に実行する必要があります。したがって、monkeypatch smtplib.SMTP.connectへのセッションスコープの自動使用フィクスチャを作成した場合、1つのテストでこのモンキーパッチを元に戻し、後で復元する関数スコープのフィクスチャを作成できます。これを行う最も簡単な方法は、disallow_smtpフィクスチャとpytest-localserversmtpserverフィクスチャの両方に依存して処理する独自のsmtpserverフィクスチャを作成することだと思います。これら2つを連携させるために必要なすべてのセットアップと分解。

これは漠然とpytest-Djangoがデータベースアクセスを処理する方法です。そこでコードを試してみることができますが、単純な例とはほど遠いものであり、独自の奇妙なことがたくさんあります。

3
flub