46

私は次のディレクトリレイアウトを持っています:

runner.py
lib/
tests/
      testsuite1/
                 testsuite1.py
      testsuite2/
                 testsuite2.py
      testsuite3/
                 testsuite3.py
      testsuite4/
                 testsuite4.py

testsuite*.pyモジュールの形式は次のとおりです。

pytestをインポートする
クラスtestsomething:
      def setup_class(s​​elf):
          '''いくつかのセットアップを行う'''
          #ここでいくつかのセットアップを行います      
      def teardown_class(s​​elf):
          ''''分解を行う''''
          #ここでいくつかの分解作業を行います

      def test1(self):
          #test1関連の作業を行う

      def test2(self):
          #test2関連の作業を行う

      ...。
      ...。
      ...。
      def test40(self):
          #test40関連の作業を行う

__name __ =='__main()__'の場合
   pytest.main(args = [os.path.abspath(__ file__)])

私が抱えている問題は、「testsuites」を並行して実行したいということです。つまり、testsuite1、testsuite2、testsuite3、testsuite4を並行して実行したいのですが、testsuites内の個々のテストを連続して実行する必要があります。

py.testの「xdist」プラグインを使用し、「py.test -n 4」を使用してテストを開始すると、py.testはすべてのテストを収集し、4人のワーカー間でランダムに負荷分散します。これにより、「testsuitex.py」モジュール内の各テストのたびに「setup_class」メソッドが実行されます(これは私の目的に反します。setup_classをクラスごとに1回だけ実行し、その後テストを連続して実行する必要があります)。

基本的に、実行をどのように見せたいかは次のとおりです。

worker1:testsuite1.pyのすべてのテストを連続して実行します
worker2:testsuite2.pyのすべてのテストを連続して実行します
worker3:testsuite3.pyのすべてのテストを連続して実行します
worker4:testsuite4.pyのすべてのテストを連続して実行します

while worker1, worker2, worker3 and worker4 はすべて並行して実行されます。

'pytest-xidst'フレームワークでこれを実現する方法はありますか?

私が考えることができる唯一のオプションは、runner.py内で各テストスイートを個別に実行するためにさまざまなプロセスを開始することです。

def test_execute_func(testsuite_path):
    subprocess.process('py.test%s'%testsuite_path)

__name __ =='__main__'の場合:
   #すべてのテストスイート名を収集する
   各テストスイートについて:
       multiprocessing.Process(test_execute_func、(testsuite_path、))
4

6 に答える 6

14

pytest-xdist では、現在、「ファイルごと」または「テスト スイートごと」の配布はありません。実際、ファイルごとの配布 (たとえば、ファイル内のテストは一度に最大 1 人のワーカーによってのみ実行される) が既にユース ケースに役立つ場合は、 https:/の pytest issue tracker で機能の問題を報告することをお勧めします。 /bitbucket.org/hpk42/pytest/issues?status=new&status=openとここであなたの良い説明に戻るリンク。

乾杯、ホルガー

于 2011-01-09T13:46:31.027 に答える