あなたの問題に対する完全な答えではありませんが、pytestに関する質問やヒントはほとんどありません。
(pytest-xdistではなく、単にpytest)pytestでのテストの順序を変更するには、ちょうどこのフックラッパーをインストールすることで、外出先でのテスト項目の順序を変更することができます。
conftest.py
:
import pytest
import random
random.seed()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_protocol(item, nextitem):
yield
idx = item.session.items.index(item)
remaining = item.session.items[idx+1:]
random.shuffle(remaining)
item.session.items[idx+1:] = remaining
すでに実行されているものを変更するのは意味がありませんが、残っているものだけを変更することはできません。したがって、[idx+1:]
。この例では、アイテムをシャッフルするだけですが、残りのフィーチャのリストを使用して、何でもできます。
覚えておいてください:これは、フィクスチャがどのようにセットアップされたかに影響を与えます& teardown'ed(上記の 'function'のスコープのもの)。もともと、pytestは最も効率的な方法で治具を利用できるようにテストを注文します。具体的には、nextitem
引数は、フィクスチャが終了するかどうかを追跡するために内部的に使用されます。毎回効果的に変更するので、効果は予測できません。
pytest-xdistでは、すべてが完全に異なっています。 how pytest-dist distributes the tests across the slavesを読んでください。
まず、すべてのスレーブがすべて同じテストを収集し、正確に同じ順序で収集します。順序が異なる場合、pytest-xdistは失敗します。コレクションでそれらを並べ替えることはできません。
第2に、マスタープロセスは、次に収集するリスト内のテストインデックスを次の実行テストとして送信します。したがって、コレクションは常に変更されていない必要があります。
第3に、pytest_xdist_make_scheduler
フックを再定義することができます。 pytest-xdist自体にがあります。追加/削除されたノードと対応する方法で収集されたテストを使用して、schedule()
メソッドでテストをスケジューリングする独自のロジックを定義することができます。
第4に、これは簡単すぎるでしょう。 .schedule()
メソッドは、スレーブから送信されたslave_collectionfinish
イベントでのみ呼び出されます。私はこれを言うのは残念ですが、このイベントを引き起こし、残りのテストを再スケジュールするには、スレーブプロセスを強制終了して再起動する必要があります。
pytest-xdistの実装は、巨大な&という複雑なものになります。しかし、私はこれがあなたにいくつかのヒントを与えることを願っています。