У меня есть следующий макет каталога:
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__)])
Проблема заключается в том, что я хотел бы выполнить "testuites" параллельно, то есть хочу, чтобы testuite1, testsuite2, testsuite3 и testsuite4 запускались параллельно, но отдельные тесты внутри testuites должны выполняться серийно.
Когда я использую плагин "xdist" из py.test и запускаю тесты с использованием "py.test -n 4", py.test собирает все тесты и произвольно загружает балансировку тестов среди 4-х работников. Это приводит к тому, что метод "setup_class" должен выполняться каждый раз каждого теста в модуле "testuitex.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"?
Единственная возможность, о которой я могу думать, это запустить различные процессы для выполнения каждого тестового пакета отдельно в 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,))