Есть ли способ контролировать, как pytest-xdist выполняет тесты параллельно? - PullRequest
26 голосов
/ 09 января 2011

У меня следующая структура каталогов:

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

Формат модулей testsuite * .py выглядит следующим образом:

import pytest 
class testsomething:
      def setup_class(self):
          ''' do some setup '''
          # Do some setup stuff here      
      def teardown_class(self):
          '''' do some teardown'''
          # Do some teardown stuff here

      def test1(self):
          # Do some test1 related stuff

      def test2(self):
          # Do some test2 related stuff

      ....
      ....
      ....
      def test40(self):
          # Do some test40 related stuff

if __name__=='__main()__'
   pytest.main(args=[os.path.abspath(__file__)])

У меня проблема в том, что я хотел бывыполнить «testsuites» параллельно, то есть я хочу, чтобы testsuite1, testsuite2, testsuite3 и testsuite4 запускал выполнение параллельно, но отдельные тесты в пределах testsuites должны выполняться последовательно..test и запустить тесты с помощью 'py.test -n 4', py.test собирает все тесты и случайным образом балансирует нагрузку между 4 работниками.Это приводит к тому, что метод «setup_class» выполняется каждый раз при каждом тесте в модуле «testsuitex.py» (что противоречит моей цели. Я хочу, чтобы setup_class выполнялся только один раз для каждого класса, а тесты выполнялись последовательно после него).

По сути, я хочу, чтобы выполнение выглядело так:

worker1: executes all tests in testsuite1.py serially
worker2: executes all tests in testsuite2.py serially
worker3: executes all tests in testsuite3.py serially
worker4: executes all tests in testsuite4.py serially

, в то время как worker1, worker2, worker3 and worker4 все выполняются параллельно.

Есть ли способ добиться этого в 'pytest?-xidst 'framework?

Единственный вариант, о котором я могу подумать, - запустить разные процессы для индивидуального выполнения каждого набора тестов в runner.py:


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

if __name__=='__main__':
   #Gather all the testsuite names
   for each testsuite:
       multiprocessing.Process(test_execute_func,(testsuite_path,))

Ответы [ 3 ]

12 голосов
/ 09 января 2011

При использовании pytest-xdist в настоящее время не существует дистрибутивов для каждого файла или для набора тестов.На самом деле, если распределение по каждому файлу (например, тесты в файле будут выполняться не более чем одним работником за раз) уже помогло бы вашему варианту использования, я призываю вас подать проблему с функцией с помощью средства отслеживания проблем pytest на https://bitbucket.org/hpk42/pytest/issues?status=new&status=open и ссылку на ваше хорошее объяснение здесь.

ура, Хольгер

4 голосов
/ 06 июня 2019

Вы можете использовать --dist=loadscope, чтобы сгруппировать все тесты в одном классе тестов.Вот документ от pytest-xdist на pypi

По умолчанию опция -n отправляет ожидающие тесты любому работнику, который доступен, без какого-либо гарантированного заказа, но выможно управлять этим с помощью следующих параметров:

--dist=loadscope: тесты будут сгруппированы по модулю для функций тестирования и по классу для методов тестирования, затем каждая группа будет отправлена ​​доступному работнику, гарантируя, что все тесты вгруппа работает в том же процессе.Это может быть полезно, если у вас есть дорогие приборы уровня модуля или класса.В настоящее время группировки не могут быть настроены, так как группировка по классу имеет приоритет над группировкой по модулю.Эта функция была добавлена ​​в версии 1.19.

--dist=loadfile: тесты будут сгруппированы по имени файла, а затем будут отправлены доступному работнику, что гарантирует выполнение всех тестов в группе на одном работнике.Эта функция была добавлена ​​в версии 1.21.

0 голосов
/ 14 июня 2019

Да, есть такие способы, доступные опции для версии xdist 1.28.0 следующие:

  • --dist=each: отправляет все тесты на все узлы, поэтому каждый тест выполняется на каждом узле.
  • --dist=load: Распределяет тесты, собранные по всем узлам, поэтому каждый тест запускается только один раз. Все узлы собирают и отправляют тестовый набор и когда все коллекции (тестовых наборов) получены, подтверждается, что они идентичные коллекции. Затем коллекция делится на чанки и чанки передаются на узлы для исполнения.
  • --dist=loadscope Распределяет тесты, собранные по всем узлам, поэтому каждый тест выполняется только раз. Все узлы собирают и отправляют список тестов и когда все коллекции получены, подтверждено, что они идентичны. Затем коллекция делится на рабочие единицы, сгруппированные по объему теста, и эти рабочие единицы отправляются на узлы.
  • --dist=loadfile Распределяет тесты, собранные по всем узлам, поэтому каждый тест выполняется только раз. Все узлы собирают и отправляют список тестов и когда все коллекции получены, подтверждено, что они идентичны. Затем коллекция разделяется на рабочие единицы, сгруппированные по тестовому файлу, и эти рабочие единицы отправляются на узлы.

Если вам нужна дополнительная информация, я рекомендую вам прямо перейти к фактической реализации планировщиков и проверить, как осуществляется распределение.

...