pytest-xdist 进行高效并行自动化测试
pytest-xdist 的核心功能是通过多进程分发测试任务,每个进程独立运行测试,确保测试隔离。2025 年 3 月 25 日,pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载,表明其在测试社区中的广泛接受。
在自动化测试中,随着测试用例数量的增加,测试执行时间可能会显著延长,影响开发和交付效率。为了解决这一问题,pytest-xdist插件应运而生,它通过并行化测试执行,显著缩短了测试运行时间。
pytest-xdist 是 pytest 的一个扩展插件,主要用于实现测试用例的并行执行和分布式测试。通过利用多进程或者多机分布式的方式,pytest-xdist 能够显著缩短测试执行时间,提升持续集成(CI)流程的效率。
pytest-xdist是基于pytest的一个插件,支持多进程并行或分布式执行测试用例。利用多核CPU或多台主机的资源,pytest-xdist可以加快测试执行速度,提升CI/CD流程的效率。

在自动化测试中,当测试用例数量庞大时,单进程顺序执行的速度往往难以满足需求。pytest-xdist 是基于 pytest 的一个插件:
-
在单台机器上利用多进程并行运行测试,充分利用多核 CPU 的优势;
-
实现分布式测试,在多台机器上同时执行测试;
-
结合负载均衡策略(按用例、文件或模块分配任务),提高并行执行的效率;
-
支持自动失败重试、覆盖率统计等功能;
利用多进程并行或分布式执行测试用例,这不仅能显著缩短测试运行时间,还能提升 CI/CD 流程的效率。
安装与基本使用
从 pytest-xdist 文档:How to use 中,提取详细使用步骤:
| 步骤 | 描述 | 示例 |
|---|---|---|
| 安装 pytest-xdist | 使用 pip 安装插件 | pip install pytest-xdist |
| 运行并行测试 | 使用 -n 选项指定工作进程数 | pytest -n 4 使用 4 个进程并行运行测试 |
| 自动检测 CPU 核心 | 使用 -n auto 自动检测 CPU 核心数 | pytest -n auto 自动分配进程数 |
| 配置测试分布 | 使用 --dist loadscope 指定分布范围,例如按类分配 | pytest -n 4 --dist loadscope=class 按类分配测试 |
| 确保测试独立 | 测试需设计为无共享状态,使用 tmp_path 夹具为每个测试创建临时目录 | 在测试中使用 def test_example(tmp_path): 创建隔离文件操作 |
| 处理输出 | 使用 -s 选项捕获输出,避免多进程输出混乱 | pytest -n 4 -s 捕获标准输出 |
| 分布式测试 | 使用 -a 选项指定远程机器,通过 SSH 连接多台机器 | pytest -n 4 --dist ssh -a "machine1 machine2" 在多台机器上运行 |
| 监控进度 | 查看控制台输出,观察每个工作进程的测试进度 | 控制台显示类似 "worker1: test_module.py::test_func [PASSED]" 的信息 |
详细使用指南
以下是使用 pytest-xdist 进行高效并行自动化测试的系统性指南,确保测试工程师快速上手:
安装
通过 pip 安装 pytest-xdist 非常简单:
pip install pytest-xdist
安装后,可以通过 pytest -h 查看新增的命令行选项。
基本命令
最简单的并行运行命令是使用 -n 选项:
pytest -n 4
这里 4 表示使用 4 个进程并行运行测试
如果希望自动检测系统的 CPU 核心数,并充分利用所有资源,可以使用:
pytest -n auto
简单示例
下面是一个简单的示例,如何结合 pytest-xdist 进行并行测试
示例文件:test_sample.py
import timedef test_one():time.sleep(1)assert Truedef test_two():time.sleep(1)assert Truedef test_three():time.sleep(1)assert Truedef test_four():time.sleep(1)assert True
运行以下命令来并行执行上述 4 个测试用例:
pytest -n 4 test_sample.py
此命令会将 4 个测试用例分配到 4 个进程中同时运行,从而显著减少总体执行时间。
负载均衡策略
pytest-xdist 支持多种负载均衡策略,通过 --dist 参数进行配置:
| 策略 | 说明 |
|---|---|
--dist=load | 按测试用例均衡分配,默认策略。 |
--dist=loadscope | 按测试模块分配,确保同一模块内的用例在同一进程执行,减少数据共享冲突。 |
--dist=loadfile | 按文件级别分配测试,适用于每个文件测试之间相互独立的场景。 |
例如,按模块进行负载均衡:
pytest -n 4 --dist=loadscope
负载均衡策略可以根据项目的实际情况和测试用例的特点灵活选择:
-
load 策略适合大多数测试用例都较为独立且执行时间均衡的情况,通过精细地按用例分配,能最大化利用多核 CPU 的优势。
-
loadscope 策略在模块内测试共享资源或有较重初始化开销时更有优势,能够减少重复工作并控制状态影响范围
Selenium 并行 UI 自动化测试案例
在自动化测试中,Selenium 常用于 Web UI 测试,而 pytest-xdist 则能通过多进程并行运行测试用例,大幅缩短整体执行时间。
将二者结合使用时,需要注意以下几点:
-
独立 WebDriver 实例:由于测试在不同进程中并行执行,每个进程都必须创建自己的 WebDriver 实例,不能共享同一个浏览器驱动。
-
环境隔离:确保各个进程中的测试环境(如浏览器驱动、配置文件等)互不干扰,避免因资源竞争导致测试失败。
示例文件:test_multiple_search.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import Bydef create_driver():options = webdriver.ChromeOptions()options.add_argument('--headless') # 使用无头模式options.add_argument('--disable-gpu')options.add_argument('--no-sandbox')options.add_argument('--window-size=1920,1080')return webdriver.Chrome(options=options)@pytest.fixture(scope="function")
def driver():driver_instance = create_driver()yield driver_instancedriver_instance.quit()def test_google_search(driver):# 测试 百度 搜索driver.get("https://www.baidu.com")search_box = driver.find_element(By.ID, "kw")search_box.send_keys("pytest-xdist")search_box.submit()driver.implicitly_wait(3)assert "pytest-xdist" in driver.page_sourcedef test_bing_search(driver):# 测试 Bing 搜索driver.get("https://www.bing.com")search_box = driver.find_element(By.NAME, "q")search_box.send_keys("pytest-xdist")search_box.submit()driver.implicitly_wait(3)assert "pytest-xdist" in driver.page_sourcedef test_duckduckgo_search(driver):# 测试 DuckDuckGo 搜索driver.get("https://www.duckduckgo.com")search_box = driver.find_element(By.NAME, "q")search_box.send_keys("pytest-xdist")search_box.submit()driver.implicitly_wait(3)assert "pytest-xdist" in driver.page_source
使用 pytest-xdist 的 -n 参数启动并行执行,例如:
pytest -n 3 test_multiple_search.py
这将启动 3 个进程,每个进程各自运行不同的测试用例,从而加速整体测试执行。
Appium 移动端测试案例
在移动端自动化测试中,Appium 是一个常用工具,而 pytest-xdist 则可以将测试用例并行执行,从而大幅缩短总的测试时间。下面以 Android 计算器应用为例,展示如何利用 pytest-xdist 并行测试 App 的功能。
示例文件:test_calculator_app.py
本示例中包含两个测试用例:一个测试加法,一个测试减法。每个测试用例通过 pytest fixture 独立创建一个 Appium WebDriver 实例,确保并行运行时互不干扰。
import pytest
from appium import webdriver
from time import sleep@pytest.fixture(scope="function")
def driver():# 配置 desired capabilities,根据实际情况调整 deviceName、appPackage 和 appActivitydesired_caps = {"platformName": "Android","deviceName": "Android Emulator", # 或实际设备 ID"appPackage": "com.android.calculator2","appActivity": ".Calculator","automationName": "UiAutomator2"}# 启动 Appium WebDriver 实例driver_instance = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)yield driver_instancedriver_instance.quit()def test_addition(driver):"""测试计算器的加法功能,计算 2 + 3 = 5注意:元素 ID 依据具体设备和计算器应用版本可能有所不同,请根据实际情况调整"""# 点击数字 2driver.find_element_by_id("com.android.calculator2:id/digit_2").click()# 点击加号driver.find_element_by_id("com.android.calculator2:id/op_add").click()# 点击数字 3driver.find_element_by_id("com.android.calculator2:id/digit_3").click()# 点击等号driver.find_element_by_id("com.android.calculator2:id/eq").click()# 等待页面更新结果sleep(2)# 获取结果文本(此处 ID 根据具体 App 可能不同)result = driver.find_element_by_id("com.android.calculator2:id/formula").textassert result == "5", f"期望结果为 5,但实际结果为 {result}"def test_subtraction(driver):"""测试计算器的减法功能,计算 7 - 2 = 5"""# 点击数字 7driver.find_element_by_id("com.android.calculator2:id/digit_7").click()# 点击减号driver.find_element_by_id("com.android.calculator2:id/op_sub").click()# 点击数字 2driver.find_element_by_id("com.android.calculator2:id/digit_2").click()# 点击等号driver.find_element_by_id("com.android.calculator2:id/eq").click()sleep(2)result = driver.find_element_by_id("com.android.calculator2:id/formula").textassert result == "5", f"期望结果为 5,但实际结果为 {result}"
使用 2 个进程并行执行测试:
pytest -n 2 test_calculator_app.py
此命令会启动 2 个 worker 进程,每个测试用例都在独立进程中运行,确保每个进程都有独立的 Appium WebDriver 会话。
在使用pytest-xdist进行并行测试时,需要注意以下几点:
-
测试用例的独立性:确保测试用例之间没有依赖关系,可以独立运行。CSDN博客
-
共享资源的管理:如果测试用例共享资源(如文件、数据库等),需要确保并行执行时不会产生冲突。
-
环境隔离:在多进程并行执行时,注意测试环境的隔离,避免相互影响。
使用时注意事项:
在使用pytest-xdist进行并行测试时,需要注意以下几点:
-
测试用例的独立性:确保测试用例之间没有依赖关系,可以独立运行。
-
共享资源的管理:如果测试用例共享资源(如文件、数据库等),需要确保并行执行时不会产生冲突。
-
环境隔离:在多进程并行执行时,注意测试环境的隔离,避免相互影响。
-
设备资源:并行测试会同时占用多个设备或模拟器,确保设备资源充足。如果使用同一设备,可能会引起会话冲突,建议配置多台设备或多个模拟器。
-
desired capabilities:如果需要同时在多台设备上执行测试,请为每个设备配置不同的
deviceName、udid,并相应调整 Appium 服务端口。
最佳实践与建议
- 测试分类:将测试分为单元测试(适合并行)和集成测试(可能需顺序执行),优先并行单元测试。
- 资源管理:确保测试环境资源(如数据库连接)能支持并行执行,必要时限制工作进程数。
- 性能优化:对于 I/O 密集型测试,并行可能效果有限,建议结合异步测试。
- 日志记录:使用 Pytest 的日志插件(如 pytest-logging)记录详细输出,便于调试。
与其他工具的比较
以下是并行测试工具的对比:
| 工具 | 主要特点 | 适用场景 |
|---|---|---|
| pytest-xdist | Pytest 插件,支持多进程和分布式测试 | Python 项目,CI/CD 集成 |
| nose2 | Python 测试框架,支持并行测试 | 传统 Python 测试,社区较小 |
| unittest | Python 内置框架,可结合 multiprocessing | 基础测试,需自定义并行逻辑 |
| TestNG | Java 测试框架,支持并行测试 | Java 项目,需复杂配置 |
| JUnit | Java 测试框架,可结合并行工具 | Java 项目,需额外工具支持 |
研究表明,pytest-xdist 在 Python 社区中应用广泛,特别适合自动化测试。
使用 pytest-xdist 进行高效并行自动化测试,可显著缩短执行时间,但需确保测试独立性和正确配置。通过掌握安装、运行和优化技巧,您可以提升测试效率,确保软件质量。这不仅是技术工具,更是优化开发流程的关键。
“用 pytest-xdist 并行测试,让您的自动化从此飞速!”
相关文章:
pytest-xdist 进行高效并行自动化测试
pytest-xdist 的核心功能是通过多进程分发测试任务,每个进程独立运行测试,确保测试隔离。2025 年 3 月 25 日,pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载,表明其在测试社区中的广泛接受。 在自动化测试中,随…...
位置编码再思考
最近在做多模态,发现基于 transformer 的多模态,position embedding 是一个非常重要的内容,而且还没有统一方案,先暂做记录,几篇还不错的博客: Transformer学习笔记一:Positional Encoding&…...
Deepseek API+Python 测试用例一键生成与导出 V1.0.3
** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…...
[c语言日寄MAX]深度解析:大小端字节序
【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还…...
Android ADB工具使用教程(从安装到使用)
目录 ADB工具介绍 什么是ADB? 组成 主要功能 ADB工具安装与连接设备 WIFI连接,提示计算机积极拒绝10061 WIFI成功连接后,拔掉数据线显示offline 提示adb版本不一致编辑 ADB工具使用 ★日志操作命令 adb logcat:抓取日志 日志格式…...
开个坑记录一下树莓派4B部署yolo的一些问题
问题一:操作系统与内核信息 这个问题困扰了我一天半,下载的时候显示的信息是aar64的系统,但是这并无意味着一个问题,那就是你的操作系统是64位的。需要采用如下的指令查看: getconf LONG_BIT 我在树莓派得出来的操作…...
基于SSM框架的线上甜品销售系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此网上销售信息的…...
基于 FPGA的HLS技术与应用
1、hls简介 HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。 2、循环优化 约束语法: #pragma HLS unroll #pragma HLS PIPELINE II1 绝大多数循环都以串行的方式执行,这种执行方…...
Redis原理:Monitor 实现
在调用 Redis 的 MONITOR 命令后,可以在对应的客户端上实时查看服务器的执行情况。今天,我们将从源码的角度来深入探讨 MONITOR 机制是如何处理这些请求以及如何将数据反馈给用户的。 MONITOR 命令的实现 Redis 中所有命令的具体实现细节都可以在其源代…...
计算机工具基础(七)——Git
Git 本系列博客为《Missing in CS Class(2020)》课程笔记 Git是一种分布式版本控制系统,被其跟踪的文件可被查询精细到行的修改记录、回退版本、建立分支等 模型 一般流程:工作区 → \to →暂存区 → \to →仓库(本地 → \to →远端) 工作区࿱…...
鸿蒙开发:父组件如何调用子组件中的方法?
前言 本文基于Api13 很多的场景下,父组件需要触发子组件中的某个方法,来实现一些特定的逻辑,但是ArkUI是声明式UI,不能直接调用子组件中的方法,那么怎么去实现这个功能呢? 举一个很常见的案例,通…...
23种设计模式-创建型模式-工厂方法
文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式,它提供了在父类中创建对象的接口,但允许子类…...
142. 环形链表 II——考察数学,难!
142. 环形链表 IIhttps://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…...
C++常见问题与思考
TLS(线程本地存储)原理 线程本地存储(Thread Local Storage,TLS)是一种机制,它允许每个线程拥有自己独立的变量实例,这些变量的生命周期与线程相同。也就是说,不同线程对同一个 TLS…...
从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南
本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…...
关于c++的几个简单算法
一. 动态规划(Dynamic Programming) 难点:状态转移方程的构建和初始化条件的设计 典型问题:01背包问题 分析: 状态定义 dp[i][j] 表示前i个物品放入容量为j的背包的最大价值。状态转移需要判断是否选择当前物品。 #i…...
WPF MergedDictionaries详解
在 WPF 中,ResourceDictionary.MergedDictionaries 是一个非常重要的特性,用于将多个资源字典(ResourceDictionary)合并到一个主资源字典中。这种机制使得资源的管理和复用变得更加灵活和高效。 1. MergedDictionaries 的作用 Me…...
一套云HIS系统源码,系统融合HIS与EMR,基于云端部署,采用B/S架构与SaaS模式
云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级及以下医院可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核…...
DisplayPort(DP)详解
一、DisplayPort的定义与核心特性 DisplayPort(DP) 是由 视频电子标准协会(VESA) 制定的 高性能数字音视频接口,专为高分辨率显示器和多屏应用设计。其核心特性包括: 高带宽:DisplayPort 2.0支…...
C++数据结构(搜索二叉树)
1.二叉树搜索的概念 二叉搜索数也成为二叉排序树,它或者是一颗空树,或者是满足以下性质的树: 1.若他的左子树不为空,则左子树上的所有节点的值都小于等于根节点的值。 2.若他的右子树不为空,则右子树上的所有节点的值…...
OpenCV图像拼接(6)图像拼接模块的用于创建权重图函数createWeightMap()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…...
Micropython RPI-PICO 随记-双PICO串口传数据
开发环境 MCU:双 Pico1(无wifi版),串口相连,需要共地使用固件:自编译版本开发环境:MacBook Pro Sonoma 14.5开发工具:Thonny 4.1.6开发语言:MicroPython 1.24.0 上位机…...
炫酷的HTML5粒子动画特效实现详解
炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...
YoloV8训练和平精英人物检测模型
概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…...
BC93 公务员面试
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言练习题分享 🌍文章目入 #include <stdio.h> int main() {int score 0, max 0, min 100, sum 0, count 0; while (scanf("%d", &score) ! EOF){…...
3.0 Disruptor的使用介绍(一)
Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …...
基础实验2-2.1 整数的分类处理
基础实验2-2.1 整数的分类处理 - 浙大版《数据结构学习与实验指导(第2版)》题目集 (pintia.cn) 给定 N 个正整数,要求你从中得到下列三种计算结果: A1 能被 3 整除的最大整数A2 存在整数 K 使之可以表示为 3K1 的整数的个数A3…...
[深度学习]图像分类项目-食物分类
图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…...
有价值的面试问题
迅雷一面 都是c和网络问题 了解epoll吗?解释下水平触发和边缘触发,医院的叫号系统应该算哪一种 c类a有成员b,成员b调用了a的函数,但是a不小心把b的成员删除了,会发生什么,怎么解决 c类a有一个static的函数…...
禁用ONLY_FULL_GROUP_BY模式
这是由于MySQL启用了ONLY_FULL_GROUP_BY模式导致的。以下是禁用该模式的三种方法,结合你的需求选择最合适的方案: 一、临时禁用(重启后失效) 1. 当前会话禁用 直接在SQL客户端执行以下命令,仅对当前数据库连接有效&…...
