pytest教程-27-分布式执行用例插件-pytest-xdist

news/2024/5/13 13:43:41

上一小节我们学习了pytest随机执行用例插件-pytest-random-order,本小节我们讲解一下pytest分布式执行用例插件pytest-xdist。

前言

平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,

我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务分成2部分,于是时间缩减一半。如果是十个人一起执行,1000个用例理论上只需100分钟就能完成,时间缩短到了1/10。大大节省的测试时间,为项目节省了时间成本。同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的pytest分布式执行插件pytest-xdist。

什么是 pytest-xdist

pytest-xdist 是 pytest 测试框架的一个插件,它提供了多进程、多线程和分布式测试的支持。其中,多进程并发是其中一个引人注目的特性,它允许你同时在多个进程中运行测试用例,以加速整个测试过程。

分布式用例设计原则

  • 用例之间是独立的,用例之间没有依赖关系,用例可以完全独立运行【独立运行】
  • 用例执行没有顺序,随机顺序都能正常执行【随机执行】
  • 每个用例都能重复运行,运行结果不会影响其他用例【不影响其他用例】

安装插件

pip install pytest-xdist

基本使用

在安装了 pytest-xdist 之后,你可以在命令行中使用 -n 参数来指定并行执行的进程数。例如,如果你想要使用 4 个进程来运行测试,你可以这样做:

pytest -n 4

这将启动 4 个 worker 进程来并行执行测试。

控制执行顺序

默认情况下,pytest-xdist 是无序执行测试的。如果你需要按照一定的顺序执行测试,可以使用 --dist 参数。例如:

  • --dist=loadscope:按照模块(module)和测试类(class)来分组,确保同一个组的测试用例在同一进程中执行。
pytest -n 4 --dist=loadscope
  • --dist=loadfile:按照文件名来分组,确保同一个文件中的测试用例在同一进程中执行。
pytest -n 4 --dist=loadfile
  • --dist loadgroup: 测试按xdist_group标记分组。每组作为一个整体分配给可用的执行器。这保证了具有相同xdist_ group名称的所有测试都在同一个worker中运行。
@pytest.mark.xdist_group(name="group1")
def test1():passclass TestA:@pytest.mark.xdist_group("group1")def test2():pass 

使用示例

顺序执行

import time
import pytest
def test_01():print('case 1')time.sleep(2)assert 1 == 1
def test_02():print('case 2')time.sleep(2)assert 1 == 1
def test_03():print('case 3')time.sleep(2)assert 1 == 1
def test_04():print('case 4')time.sleep(2)assert 1 == 1
def test_05():print('case 5')time.sleep(2)assert 1 == 1
if __name__ == '__main__':# 顺序执行pytest.main(['-s', 'test_78.py'])

325b1c526987d50659b46096f6735a8a.png

并行执行:加-n参数后面数字是并行数

import time
import pytest
def test_01():print('case 1')time.sleep(2)assert 1 == 1
def test_02():print('case 2')time.sleep(2)assert 1 == 1
def test_03():print('case 3')time.sleep(2)assert 1 == 1
def test_04():print('case 4')time.sleep(2)assert 1 == 1
def test_05():print('case 5')time.sleep(2)assert 1 == 1
if __name__ == '__main__':# 并行执行 加-n参数后面数字是并行数pytest.main(['-s', 'test_78.py', '-n=4', '--html=report.html', '--self-contained-html'])

3a31e0378023cc87755da865d09b9c7b.png

主从分布式测试

pytest-xdist 还支持主从(master-slave)模式,你可以在多台计算机上运行测试。首先,你需要在所有计算机上安装 pytest-xdist。然后,你可以在主机(master)上启动测试,同时在从机(workers)上启动监听。

主机(Master)配置

在主机上,创建一个配置文件(例如 pytest.ini),并设置以下参数:

[pytest]
addopts = -n auto

然后,在主机上运行以下命令:

pytest --dist=loadscope

从机(Worker)配置

在每台从机上,运行以下命令来启动监听:

pytest --dist=loadscope

这将使从机准备好接收来自主机的测试任务。

示例项目结构

假设你有一个名为 MyPytestDemo 的项目,其结构如下:

MyPytestDemo/
|-- conftest.py
|-- test_module1.py
|-- test_module2.py

在 conftest.py 中,你可以定义 fixtures:

# conftest.py
import pytest@pytest.fixture(scope="session")
def setup():# 设置测试yield# 清理测试

在 test_module1.py 和 test_module2.py 中,你可以编写测试用例:

# test_module1.py
import pytestdef test_example1(setup):# 测试逻辑def test_example2(setup):
# 测试逻辑

运行分布式测试

在主机上运行分布式测试:

pytest --dist=loadscope -n auto MyPytestDemo/

这将在所有安装了 pytest-xdist 的计算机上并行执行测试。

cf67903e74b5404db5f6899add7c903a.jpeg


http://www.mrgr.cn/p/23565231

相关文章

生猪

感觉没调整完

为什么我反对过度使用TypeScript?

大家好, 我前夕. TypeScript在今天早已无人不知, 但是我认为TypeScript的使用应该遵循中庸之道. 要使用, 但不要过度使用.前言 在2024年, TypeScript肯定算不上什么新鲜的技术. 但是经过长时间的使用, 我认为可以使用, 但是要适度. 类型跟不上业务的变化 我们知道TypeScript的类…

基于PWM控制的三相整流器simulink仿真

整理了基于PWM控制的三相整流器simulink仿真模型,附赠报告,效果明显。 三相全桥PWM整流器,通过对电路进行SPWM控制,使得整流桥的交流输出端产生正弦PWM电压,对各相电压进行控制,就可以使各相电流为正弦波且和电压相位相同,从而使功率囚数为1。当电路工作…

【华为】DHCP实验配置(接口下和全局下)

【华为】DHCP实验配置 拓扑实验要求设备核心交换机SVI配置接口下DHCP全局下DHCP PCPC1PC2 查看VLAN验证 配置文档 拓扑 实验要求 一台三层交换机,两台PC PC1 和 PC2 获取地址用DHCP方式,并处于不同VLAN 并指定PC1 是在接口下的DHCP获取,而PC…

如何用python运用ocr技术来识别文字

要先安装ocr技术,也就是光学符号识别,通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其他印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的文本的技术(我在百度百科抄的),市面上大多数的文本识别,都基本是ocr技术。那用python怎么搞呢…

LCR 184.设计自助结算系统

思路分析: 这个题,我们需要单调队列来维护当前的最大值,达到O(1)的时间复杂度,同时使用一个数组记录当前出现的元素 get_max就返回队头即可, add就在加入之前删除掉所有小于他的元素即可,等于的元素应该放在不删除.不然就会提前出现-1 而remove会比较有趣,他每次是返回数组的…

c++ 快速复习第一部份

去年有事无事学过一c++ ,,由于工作用不上,学来没有用,所以学得乱七八的,最近需要复习一下,因为最近想学习一下硬 件相关 第一 引用头文件和自定义头#include <iostream> using namespace std; //引用命名空间可以避免使用::语法 int main() {默认输出写法:s…

30V-STM32设计项目

30V-STM32设计 一、项目描述 (已验证) 基于STM32c8t6芯片设计的开发板&#xff0c;支持4-30V宽电压输入&#xff0c;串口模式自动下载功能&#xff0c;支持串口和STlink&#xff0c;方式下载程序 二、原理图介绍 电源电路采用了DCDCLDO电路&#xff0c;如果是外接DC头供电的话&…

20240422,C++文件操作

停电一天之后&#xff0c;今天还有什么理由不学习呜呜……还是没怎么学习 目录 一&#xff0c;文件操作 1.1 文本文件 1.1.1 写文件 1.1.2 读文件 1.2 二进制文件 1.2.1 写文件 1.2.2 读文件 一&#xff0c;文件操作 文件操作可以将数据持久化&#xff0c;对文件操…

windows或wsl1如何访问wsl2的docker的2375端口

-H tcp://localhost:2375 一定要使用localhost才可以在windows侧或wsl1侧访问systemctl daemon-reload systemctl restart dockerwsl1: export DOCKER_HOST=tcp://localhost:2375

[CISCN 2022 东北]hana 题解(易语言逆向)

[CISCN 2022 东北]hana 脱壳过程 首先看一下程序信息程序检测到了UPX的特征,但是下面的特征又显示是VMP壳 使用010 Editor打开文件将两个VMP0和VMP1改成UPX0和UPX1并保存文件,接下来使用UPX脱壳分析程序 这里需要用到一个易语言反编译插件以及一个易语言函数查询网站 IDA易语…

第3篇:创建Nios II工程之Hello_World<二>

Q&#xff1a;上一期介绍完基本设计流程和实验原理&#xff0c;接着我们完成系统硬件设计部分&#xff0c;包括Platform Designer系统及Quartus工程。 A&#xff1a;依次搜索并添加Nios II Processor、JTAG UART、On-Chip Memory和System ID IP组件&#xff0c;连接各组件并As…

帕鲁杯web mylove复现

题目给了源码和phpinfo()<?phpclass a{public function __get($a){$this->b->love();} }class b{public function __destruct(){$tmp = $this->c->name;}public function __wakeup(){$this->c = "no!";$this->b = $this->a;} }class xk{pub…

AI图书推荐:《企业AI转型:如何在企业中部署ChatGPT?》

Jay R. Enterprise AI in the Cloud. A Practical Guide...ChatGPT Solutions &#xff08;《企业AI转型&#xff1a;如何在企业中部署ChatGPT&#xff1f;》&#xff09;是一本由Rabi Jay撰写、于2024年由John Wiley & Sons出版的书籍&#xff0c;主要为企业提供实施AI转型…

攻防世界-难度1- xxxorrr

攻防世界-逆向-难度1 根据提示应该是异或加密,找到密文和密钥,再异或回去就得到原文。 参考 https://blog.csdn.net/qq_63699339/article/details/130657034 官方wp 逆向解法 梳理一下程序执行逻辑 1.在main函数之前的init-array段首先执行了sub84A在 ELF (Executable and Li…

RabbitMQ工作模式(4) - 路由模式

概念 路由模式&#xff08;Routing&#xff09;是 RabbitMQ 中的一种消息传递模式&#xff0c;也称为直连模式。它允许生产者将消息发送到一个交换机&#xff0c;并指定一个或多个路由键&#xff08;routing key&#xff09;&#xff0c;交换机根据路由键将消息路由到与之匹配的…

leetcode(力扣) 2866. 美丽塔 II

原题链接 暴力做法 (时间复杂度 O(n^2)) 每次选取下标 i 为峰值, 进行 n 次,对每次取max就可以找打答案对于 i 左边的序列: 需要满足序列是非递减的, 同时每个值尽可能大 所以满足: 下标为 j 的位置上的数 <= 下标是 (j, i] 的最小的值 (等于时取得最大值) , 同时需要保证…

科技感十足特效源码

源码介绍 科技感十足特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 源码下载 科技感十足特效源码

CCS项目持续集成

​ 因工作需要&#xff0c;用户提出希望可以做ccs项目的持续集成&#xff0c;及代码提交后能够自动编译并提交到svn。调研过jenkins之后发现重新手写更有性价比&#xff0c;所以肝了几晚终于搞出来了&#xff0c;现在分享出来。 ​ 先交代背景&#xff1a; 1. 代码分两部分&am…

在微信上卖化妆品怎样发圈(学会写朋友圈段子卖货很简单)

大家好&#xff0c;我是只说人话&#xff0c;不讲概念&#xff0c;专给创业者们开思维脑洞 今天咱们要分享的内容比较有趣&#xff0c;教你如何写段子故事在朋友圈里做促销活动。 首先我们来看一个硬蹭明星热点的朋友圈案例。发朋友圈的是一位做装修的&#xff0c;在明星结婚的…