关于python:有没有一种方法可以控制pytest xdist如何并行运行测试?

Is there a way to control how pytest-xdist runs tests in parallel?

我有以下目录布局:

1
2
3
4
5
6
7
8
9
10
11
runner.py
lib/
tests/
      testsuite1/
                 testsuite1.py
      testsuite2/
                 testsuite2.py
      testsuite3/
                 testsuite3.py
      testsuite4/
                 testsuite4.py

testsuite*.py模块的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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中的单个测试。

当我使用py.test中的"xdist"插件并使用"py.test-n 4"启动测试时,py.test将收集所有测试并在4个工作人员之间随机加载平衡测试。这将导致每次在"testsuitex.py"模块中执行测试时都要执行的"setup-class"方法(这会破坏我的目标)。我希望每个类只执行一次Setup_类,然后在那里连续执行测试)。

实际上,我希望执行的样子是:

1
2
3
4
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中单独执行每个测试套件:

1
2
3
4
5
6
7
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,))

使用pytest xdist,目前没有"每个文件"或"每个测试套件"的分发。实际上,如果每个文件的分发(例如文件中的测试一次最多只能由一个工作人员执行)已经可以帮助您的用例,那么我鼓励您在https://bitback.org/hpk42/pytest/issues上向pytest issue tracker提交一个功能问题。status=new&status=open并在此处链接回您的良好解释。

干杯,霍格尔