2017-10-26 100 views
2

私は、実行中の順番に並べ替えるロジックを使ってテストの順序を制御したいと思います。pytestによるテストの順序を動的に制御する

私の使用例はこれです:xdistでテストを並列化しており、各テストで共通の限られたプールの外部リソースが使用されています。一部のテストでは他のテストより多くのリソースが使用されるため、一部のリソースしか利用できない場合は、実行する必要があるリソースと実行しないリソースがあります。

私はリソースの使用を最適化したいので、現在利用可能なリソースに基づいて、次に実行するテストを動的に選択したいと思います。私は収集段階で最適な順序を計算しますが、各テストの所要時間を事前に知っていないので、いつどのリソースを利用できるか予測できません。

コレクションステージが実行ステージとは異なるように見えるため、この動作をプラグインで実装する方法が見つかりませんでした。また、他の方法で実行するテストのリストを変更する別の方法はわかりませんコレクションフック。

これを実装する方法であろうと、リソースの使用率を最適化する代替アイデアであろうと、非常に感謝していますか?私の代わりは、私自身の単純なテストランナーを書くことですが、私はpytestが提供するものの残りの部分をあきらめたくありません。

ありがとうございます!

答えて

1

あなたの問題に対する完全な答えではありませんが、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の実装は、巨大な&という複雑なものになります。しかし、私はこれがあなたにいくつかのヒントを与えることを願っています。

関連する問題