web-dev-qa-db-ja.com

pytest runは並行してテストします

すべてのpytestテストを順次ではなく並行して実行したい。

私の現在のセットアップは次のようになります:

class Test1(OtherClass):
    @pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
    @pytest.mark.flaky(reruns=1)
    def test_1(self, activity_name, generate_test_id):
    """
    """

        test_id = generate_random_test_id()
        test_name = sys._getframe().f_code.co_name

        result_triggers = self.proxy(test_name, generate_test_id, test_id, activity_name)

        expected_items = ["response"]
        validate_response("triggers", result_triggers, expected_items)


    @pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
    @pytest.mark.flaky(reruns=1)
    def test_2(self, activity_name, generate_test_id):
    """
    """

        #same idea...

pytest -v -sを使用してテストを実行します。

その結果、テストは順番に実行されます。一部のテストはリモートサーバーからの応答を待機するため、時間がかかります(統合テスト)。

Pytestを並行して実行する方法はありますか?

23
Noy Mizrahi

pytest-xdist。 Qxf2はそれを非常によく説明していると思います: Pytest-XdistのQxf2

Linuxのコマンドラインは、私の好みには少し冗長です。私が使う:

pytest -n <NUM>

ここで、<NUM>は並列ワーカーの数です。

26
Claire Nielsen

pytest-xdist はほとんどの場合に優れたソリューションですが、統合テストは特別です。リモートサーバーに要求を送信した後、応答を待つ代わりに新しいスレッドで別のテストを開始できます。これは、並行ではなく並行テストです。同時実行性により、メモリと処理のオーバーヘッドがはるかに少なく、より多くのテストを一度に実行できます。

pytest-parallel プラグイン[py3.6 +]を使用して、並行および並行テストを有効にします。統合テストを同時に実行する方法は次のとおりです。

pytest --tests-per-worker auto

7
kevlened

私のテストはAWSからのグルージョブが完了するまで99.9999999%の時間待機しており、2つのコアを持つCodeBuild環境を使用していたため、一度に2つのテストしか実行できなかったため、pytest-xdistは機能しませんでした。

@kevelendのアプローチはうまくいきました。

1
hey_you