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

想要使用多个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%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手拉手Springboot整合JWT

环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…

【多省市译协盖章】2023年第九届中西部外语翻译大赛

“由中西部翻译协会共同体指导发起,各省市译协共建学术指导委员会,2023年第九届中西部外语翻译大赛由中西部翻译协会共同体秘书处(武汉公仪网络科技有限公司)承办。” (证书样图) 证书盖章单位&#xff1…

文件重命名:特殊符号影响你找文件吗?来看看这个解决方法

在日常生活和工作中,电脑已经成为必不可少的工具,而文件管理也是一项重要的任务。有时候遇到文件重命名的问题,例如当文件名中包含特殊符号时,这可能会给工作带来很大的困扰。当尝试寻找一个文件时,却发现因为文件名中…

Linux的账号及权限管理

一.管理用户账号 1.1 用户账户的分类 1.1.1 用户账号的分类 超级用户:(拥有至高无上的权利) root用户是Linux操作系统中默认的超级用户账号,对本主机拥有最高的权限,系统中超级用户是唯一的。普通用户: …

c++学习笔记(6)-类型转换

1、概念 C类型转换是将一种数据类型转换为另一种数据类型的过程。 2、分类 C中的类型转换可以从3个角度来划分: 根据类型转换是由程序员显式指定,还是由编译器自动完成,分为显式类型转换和隐式类型转换;根据参与类型转换的变量…

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.…

测试用例要如何写

​ 📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试…

IDEA基本设置

本博客适用于纯新手小白,或者刚下载IDEA想要优化开发添加配置的读者。 基础设置 不区分大小写代码补全 打开 IntelliJ IDEA。转到 “File”(文件) > “Settings”(设置)(Windows/Linux)或 “…

swagger1.2 apiPost工具测试接口没有问题,换成swagger 接口调测时报错 Required request body is missing

把 请求方法由get换成post GetMapping换成 PostMapping 原因apiPost自动把请求json参数封装到请求体里了, 但swagger没有封装,通过networker可以看到载荷里并没有任何东西

(C++)DS哈希查找—二次探测再散列(附思路和详细注释)

Description 定义哈希函数为H(key) key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。 Input 测试数据组数 1≤�≤50. 每组测试数据格式如下&#xff1a…

面试题:Zabbix 和 Prometheus 到底怎么选?

文章目录 前言历史简介PrometheusZabbix 架构对比PrometheusZabbix 综合对比总结 前言 新公司要上监控,面试提到了 Prometheus 是公司需要的监控解决方案,我当然是选择跟风了。 之前主要做的是 Zabbix,既然公司需要 Prometheus,…

【如何破坏单例模式(详解)】

✅如何破坏单例模式 💡典型解析✅拓展知识仓✅反射破坏单例✅反序列化破坏单例✅ObjectlnputStream ✅总结✅如何避免单例被破坏✅ 避免反射破坏单例✅ 避免反序列化破坏单例 💡典型解析 单例模式主要是通过把一个类的构造方法私有化,来避免重…

鸿蒙系统的分布式技术:重塑智能终端的未来

华为鸿蒙系统自发布以来,凭借其创新的分布式技术,改变了我们对智能终端的认知和使用方式。鸿蒙系统的分布式技术是一种全新的设计理念,它将不同设备、不同应用场景视为一个整体,通过共享、协同和无缝连接,为用户带来前…

android setText不生效问题

1.直接说解决方案: 在代码没问题的情况下,将你的TextView的Id改一下,然后再重启编译器即可(注意,不修改TextView的ID,单独重启是没有作用的!) 2.出现问题的过程: 产品新增一个需求&#xff0c…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token,JWT 主要用于用户登录鉴权,当用户登录之后,返回给前端一个Token,之后用户利用Token进行信息交互。 除了JWT认证之外,比较传统的还有Session认证,如何选择可以查看之前…

MAGVIT: Masked Generative Video Transformer

Paper name MAGVIT: Masked Generative Video Transformer Paper Reading Note Paper URL: https://arxiv.org/abs/2212.05199 Project URL: https://magvit.cs.cmu.edu/ Code URL: https://github.com/google-research/magvit TL;DR 2023 年 CMU、google 等发表 CVPR20…

[Python工程化之路] 搭建Python开发环境 包管理环境以及Linter

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 在工程化上,Python相比于Java,C#这类语言还是差了不少,不过整个生态还是不错的. 项目结构 一般有两种,一种称为flat另一种为src. ├── sample │ ├── AUTHORS.rst │ ├── docs | | ├── conf.py │ │ └…

深入Apache Commons Config:管理和使用配置文件

第1章:引言 咱们都知道,在软件开发中,管理配置文件是一件既重要又让人头疼的事。想象一下,咱们的应用程序有一堆设置需要调整,比如数据库的连接信息、应用的端口号,或者是一些功能的开关。如果这些信息硬编…

java实现广度优先搜索算法

广度优先搜索算法(BFS)是一种用于图遍历的算法。它从图的某个节点开始,依次访问其所有邻接节点,再依次访问邻接节点的邻接节点,以此类推,直到遍历完所有节点。 BFS使用队列数据结构来实现遍历过程。具体步…

关于 Appium 各种版本的安装,都在这里

大家在初次接触 Appium 时会看到网上各种帖子讲解如何安装 Appium,各种 Appium 版本的安装教程满天飞,而很多帖子中提供的安装教程是已经过时了的,容易误导初学者。 这篇文章带着你一起全面了解 Appium 各种版本如何选择如何安装。 一句话概述…