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

ops/2024/9/23 11:54:18/

上一小节我们学习了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.ppmy.cn/ops/7950.html

相关文章

微服务架构中的业务完整性验证设计

目录 1.概要设计 1.1 功能完整性与正确性验证 1.2 性能与响应速度验证 1.3 安全性验证 1.4 容错性与恢复能力验证 1.5 监控与日志记录验证 2.技术实现 2.1 测试策略与工具选择 2.2 身份验证与授权 2.3 数据一致性与事务管理 2.4 监控与日志 2.5 容错与恢复 2.6 数…

C 练习实例25

C 练习实例25 题目&#xff1a; 求12!3!...20!的和。 程序分析&#xff1a; 此程序只是把累加变成了累乘。 实例 #include <stdio.h>int main() {int i;long double sum,mix;sum0,mix1;for(i1;i<20;i){mixmix*i;sumsummix;} printf("%Lf\n",sum); }以…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间&#xff0c;所以在ArrayList任意位置插入或者删除元素时&#xff0c;就 需要将后续元素往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较…

CodeForce[1500-2000]——1950F - 0, 1, 2, Tree!

codeforces刷题日记 题目大意&#xff1a;要求你构造一棵树&#xff0c;树有三种节点&#xff0c;a个节点有两颗子树&#xff0c;b个节点有一颗子树&#xff0c;c给节点是叶子节点&#xff0c;求这样一颗树的最小深度。 思路&#xff1a;首先可以确定这是一颗二叉树&#xff0…

2024年4月22日加密解密验签业务总结

第一版&#xff1a;企业收入区间查询业务接口 {"info": {"_postman_id": "4d25be8f-30a6-4ac2-b920-1130fbd5555b","name": "企业区间数据查询业务接口","schema": "https://schema.getpostman.com/json/c…

RattbitMQ安装

1.RabbitMQ是什么? RabbitMQ是消息队列的一种&#xff0c;生态好&#xff0c;好学习&#xff0c;易于理解&#xff0c;时效性强,支持很多不同语言的客户端,扩展性、可用性都很不错。学习性价比非常高的消息队列&#xff0c;适用于绝大多数中小规模分布式系统。 今天先来简单讲…

SQLite R*Tree 模块(三十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展&#xff08;三十四&#xff09; 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统&#xff0c;其中…

贪吃蛇游戏实现(VS编译环境)

贪吃蛇游戏 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 0. 前言 1. 游戏背景 2. 实现后游戏画面展示 3. 技术要求 4. Win32 API介绍 4.1 Win32 API 4.2 控制台程序 4.…