pytest分布式执行插件 pytest-xdist 的高级用法

发布时间:2023年12月26日

想要使用多个CPU核心来进行测试,可以使用 -n 参数( 或者 --numprocesses)
(使用8个核心来跑测试用例)

1

pytest -n 8

使用?-n auto?参数可以利用电脑的所有核心来跑测试用例
测试时使用的算法可以根据--dist命令参数定制:

  • --dist load(默认选项):给每个CPU核心随机分配用例,不保证执行顺序。
  • --dist loadscope:对于测试函数,测试按模块分组,对于测试方法,测试按类分组。每组作为一个整体分配给可用的worker。这保证了组中的所有测试都在同一进程中运行。如果的模块级或类级fixtures,这将非常有用。按类分组优先于按模块分组。
  • --dist loadfile: 测试用例按其所在文件分组。每组作为一个整体分配给可用的worker。这保证了文件中的所有测试都在同一个辅助进程中运行。
  • --dist loadgroup: 测试按xdist_group标记分组。每组作为一个整体分配给可用的执行器。这保证了具有相同xdist_ group名称的所有测试都在同一个worker中运行。

1

2

3

4

5

6

7

8

@pytest.mark.xdist_group(name="group1")

def test1():

????pass

class TestA:

????@pytest.mark.xdist_group("group1")

????def test2():

????????pass-

这将确保test1和TestA::test2将在同一个worker中运行。没有xdist_ group标记的测试在--dist=load模式下正常运行。

  • --dist no:正常的pytest执行模式,一次运行一个测试(完全没有分发)。

例子:
项目目录结构

xdist_test.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import logging

import pytest

class TestXdist(object):

????@pytest.mark.xdist_group("group1")

????def test_one(self):

????????logging.info("1")

????????assert True

????@pytest.mark.xdist_group("group1")

????def test_two(self):

????????logging.info("2")

????????assert True

????@pytest.mark.xdist_group("group2")

????def test_three(self):

????????logging.info("3")

????????assert True

????@pytest.mark.xdist_group("group2")

????def test_four(self):

????????logging.info("4")

????????assert True

xdist_dummy_test.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 logging

import pytest

class TestXdist(object):

????@pytest.mark.run(order=1)

????@pytest.mark.xdist_group("group1")

????def test_dummy_one(self):

????????logging.info("d1")

????????assert True

????@pytest.mark.xdist_group("group1")

????@pytest.mark.run(order=2)

????def test_dummy_two(self):

????????logging.info("d2")

????????assert True

????@pytest.mark.run(order=3)

????@pytest.mark.xdist_group("group2")

????def test_dummy_three(self):

????????logging.info("d3")

????????assert True

????@pytest.mark.xdist_group("group2")

????@pytest.mark.run(order=4)

????def test_dummy_four(self):

????????logging.info("d4")

????????assert True

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

(venv) ?? pytest pytest -n auto --dist loadscope

=========================================================================== test session starts ===========================================================================

platform darwin -- Python 3.8.9, pytest-7.1.2, pluggy-1.0.0

rootdir: /Users/spock/PycharmProjects/pytest, configfile: pytest.ini

plugins: xdist-2.5.0, forked-1.4.0, ordering-0.6

[gw0] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw1] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw2] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw3] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw4] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw5] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw6] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw7] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

gw0 [8] / gw1 [8] / gw2 [8] / gw3 [8] / gw4 [8] / gw5 [8] / gw6 [8] / gw7 [8]

scheduling tests via LoadScopeScheduling

test2/xdist_dummy_test.py::TestXdist::test_dummy_one

test/xdist_test.py::TestXdist::test_one

[gw0] [ 12%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_one

[gw1] [ 25%] PASSED test/xdist_test.py::TestXdist::test_one

test2/xdist_dummy_test.py::TestXdist::test_dummy_two

test/xdist_test.py::TestXdist::test_two

[gw1] [ 37%] PASSED test/xdist_test.py::TestXdist::test_two

test/xdist_test.py::TestXdist::test_three

[gw0] [ 50%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_two

test2/xdist_dummy_test.py::TestXdist::test_dummy_three

[gw1] [ 62%] PASSED test/xdist_test.py::TestXdist::test_three

test/xdist_test.py::TestXdist::test_four

[gw0] [ 75%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_three

test2/xdist_dummy_test.py::TestXdist::test_dummy_four

[gw1] [ 87%] PASSED test/xdist_test.py::TestXdist::test_four

[gw0] [100%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_four

============================================================================ 8 passed in 0.40s ============================================================================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

(venv) ?? pytest pytest -n auto --dist loadfile

=========================================================================== test session starts ===========================================================================

platform darwin -- Python 3.8.9, pytest-7.1.2, pluggy-1.0.0

rootdir: /Users/spock/PycharmProjects/pytest, configfile: pytest.ini

plugins: xdist-2.5.0, forked-1.4.0, ordering-0.6

[gw0] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw1] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw2] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw3] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw4] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw5] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw6] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw7] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

gw0 [8] / gw1 [8] / gw2 [8] / gw3 [8] / gw4 [8] / gw5 [8] / gw6 [8] / gw7 [8]

scheduling tests via LoadFileScheduling

test/xdist_test.py::TestXdist::test_one

test2/xdist_dummy_test.py::TestXdist::test_dummy_one

[gw1] [ 12%] PASSED test/xdist_test.py::TestXdist::test_one

[gw0] [ 25%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_one

test/xdist_test.py::TestXdist::test_two

test2/xdist_dummy_test.py::TestXdist::test_dummy_two

[gw1] [ 37%] PASSED test/xdist_test.py::TestXdist::test_two

[gw0] [ 50%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_two

test2/xdist_dummy_test.py::TestXdist::test_dummy_three

test/xdist_test.py::TestXdist::test_three

[gw1] [ 62%] PASSED test/xdist_test.py::TestXdist::test_three

[gw0] [ 75%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_three

test2/xdist_dummy_test.py::TestXdist::test_dummy_four

test/xdist_test.py::TestXdist::test_four

[gw1] [ 87%] PASSED test/xdist_test.py::TestXdist::test_four

[gw0] [100%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_four

============================================================================ 8 passed in 0.38s ============================================================================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

(venv) ?? pytest pytest -n auto --dist loadgroup

=========================================================================== test session starts ===========================================================================

platform darwin -- Python 3.8.9, pytest-7.1.2, pluggy-1.0.0

rootdir: /Users/spock/PycharmProjects/pytest, configfile: pytest.ini

plugins: xdist-2.5.0, forked-1.4.0, ordering-0.6

[gw0] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw1] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw2] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw3] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw4] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw5] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw6] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

[gw7] Python 3.8.9 (default, May 17 2022, 12:55:41)? -- [Clang 13.1.6 (clang-1316.0.21.2.5)]

gw0 [8] / gw1 [8] / gw2 [8] / gw3 [8] / gw4 [8] / gw5 [8] / gw6 [8] / gw7 [8]

scheduling tests via LoadGroupScheduling

test2/xdist_dummy_test.py::TestXdist::test_dummy_three@group2

test2/xdist_dummy_test.py::TestXdist::test_dummy_one@group1

[gw1] [ 12%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_three@group2

test2/xdist_dummy_test.py::TestXdist::test_dummy_four@group2

[gw0] [ 25%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_one@group1

[gw1] [ 37%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_four@group2

test2/xdist_dummy_test.py::TestXdist::test_dummy_two@group1

[gw0] [ 50%] PASSED test2/xdist_dummy_test.py::TestXdist::test_dummy_two@group1

test/xdist_test.py::TestXdist::test_three@group2

[gw1] [ 62%] PASSED test/xdist_test.py::TestXdist::test_three@group2

test/xdist_test.py::TestXdist::test_four@group2

[gw1] [ 75%] PASSED test/xdist_test.py::TestXdist::test_four@group2

test/xdist_test.py::TestXdist::test_one@group1

[gw0] [ 87%] PASSED test/xdist_test.py::TestXdist::test_one@group1

test/xdist_test.py::TestXdist::test_two@group1

[gw0] [100%] PASSED test/xdist_test.py::TestXdist::test_two@group1

?现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!?希望能帮助到你!【100%无套路免费领取】

文章来源:https://blog.csdn.net/qq_45158700/article/details/135225223
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。