高效执行自动化用例:分布式执行工具pytest-xdist实战!

01、声明

在介绍pytest-xdist时,不讲任何原理,需要看原理的请移至官方:https://pypi.org/project/pytest-xdist/

当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而节省自动化测试时间,pytest-xdist是属于进程级别的并发

pytest-xdist插件在测试过程中可以使我们的测试用例一起并行测试,运行情况是根据你运行环境存在多个CPU,运行过程中可以进行组合测试运行,从而缩短我们的测试时间。

1、pytest-xdist插件安装

只需要在终端中运行如下命令:

pip install pytest-xdist

2、pytest-xdist执行用例的条件

需满足以下条件:

  • 每一条用例必须是独立的。用例之间没有依赖关系,用例可以完全独立运行【独立运行】

  • 每一条用例没有特定的执行顺序,就是每条用例都要遵循随机执行【随机执行】

  • 每条用例的测试结果不能影响到其他的测试用例。【不影响其他用例】

pytest-sdist 与 pytest-parallel的小区别

  • pytest-xdist在win中调用的是多进程,而parallel在win中调用的是多线程,win中只有单进程

  • pytest-xdist调用时,会使session执行多次,算是一个win的bug,但是官方给出的解决方案是,使用filelock锁

  • 使用parallel时,在win中调用多线程,但是allure报告不支持多线程,allure是集成报告,根据session来集成,所以就是出现一个线程一个报告

3、pytest-xdist使用方法

pytest -n x

n:表示使用并行参数
x:表示需要启动多少个分布式,也即使用CPU的个数

  • n auto:可以自动检测到系统的CPU核数;从测试结果来看,检测到的是逻辑处理器的数量

  • 使用auto等于利用了所有CPU来跑用例,此时CPU占用率会特别高

说明:建议最多使用1/2的CPU个数来进行执行,消耗资源太多,导致电脑太卡

接下来看实例:

在终端中分别输入并执行:pytest -vs、pytest -vs -n 2

图片

从结果可以看出,不是用分布式运行测试用例,总共用时10.71秒
 

那么接下来我们使用分布式进行运行用例,看看他运行的时间:

图片

图片

可以看出使用分布式运行用例,同时有2个线程进行执行用例,时间为6.08秒,缩短了很多的时间。

4、pytest-xdist自定义执行模式

按照同一个作用域方法来分组,然后将每个测试组发给可以执行的worker,确保同一个组的测试用例在同一个进程中执行:

 

--dist=loadscope #每个worker按类执行
示例:
pytest -v -n 3 --dist=loadscope test_demo.py

按照同一个文件名来分组,然后将每个测试组发给可以执行的worker,确保同一个组的测试用例在同一个进程中执行:

 

--dist=loadfile #每个worker按文件执行
示例:
pytest -v -n 3 --dist = loadfile test_xdist.py test_xdist_02.py test_xdist_03.py

将每个用例,分别发给所有的执行器worker,相当于开了几个执行器worker,同一个用例就执行几遍:

 

--dist=each
示例:pytest -v -n 3 --dist = each test_xdist.p

将待运行的用例随机发给可用的执行器worker,用例执行顺序随机的,目前默认采用这种方式:

 

--dist=load 和 --dist==no
示例:pytest -v -n 3 --dist = load test_xdist.py

5、如何让scope=session的fixture在test session中仅仅执行一次

pytest-xdist是让每个worker进程执行属于自己的测试用例集下的所有测试用例,这意味着在不同进程中,不同的测试用例可能会调用同一个scope范围级别较高(例如session)的fixture,该fixture则会被执行多次,这不符scope=session的预期


虽然pytest-xdist没有内置的支持来确保会话范围的夹具仅执行一次,但是可以通过使用锁定文件进行进程间通信来实现。

import pytestfrom filelock import FileLock@pytest.fixture(scope="session",autouse=True)def login(tmp_path_factory, worker_id):# 如果是单机运行 则运行这里的代码块【不可删除、修改】if worker_id == "master":"""【自定义代码块】这里就写你要本身应该要做的操作,比如:登录请求、新增数据、清空数据库历史数据等等"""uuid_value = uuid.uuid1()token = uuid_value.hexprint("fixture:请求登录接口,获取token", token)os.environ['token'] = token# 如果测试用例有需要,可以返回对应的数据,比如 tokenreturn token# 如果是分布式运行# 获取所有子节点共享的临时目录,无需修改【不可删除、修改】root_tmp_dir = tmp_path_factory.getbasetemp().parent# 【不可删除、修改】fn = root_tmp_dir / "data.json"# 【不可删除、修改】with FileLock(str(fn) + ".lock"):# 【不可删除、修改】if fn.is_file():# 缓存文件中读取数据,像登录操作的话就是 token 【不可删除、修改】token = json.loads(fn.read_text())print(f"读取缓存文件,token 是{token} ")else:"""【自定义代码块】跟上面 if 的代码块一样就行"""uuid_value = uuid.uuid1()token = uuid_value.hexprint("fixture:请求登录接口,获取token", token)# 【不可删除、修改】fn.write_text(json.dumps(token))print(f"首次执行,token 是{token} ")# 最好将后续需要保留的数据存在某个地方,比如这里是 os 的环境变量os.environ['token'] = tokenreturn token
  • 示例只需要执行一次login(因为它是只需要执行一次来定义配置选项,等等)

  • 当第一次请求这个fixture时,则会利用FileLock仅产生一次fixture数据

  • 当其他进程再次请求这个fixture时,则会从文件中读取数据

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十八节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析(ResponseOnEvent_0x86服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x86服务、事件响应、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x86…

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…

TailwindCss的vue3安装使用

按照官网的安装教程,属性最后无法生效,这是自我改良版,添加了额外步骤,但是每次引入新的tailwindcss属性 需要重新跑一次项目 npm下载tailwindcss npm install -D tailwindcss npx初始化tailwind配置 npx tailwindcss init 此时根…

个人博客测试报告

一、项目背景 个人博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构,由一系列按特定顺序排列的节点组成,这些节点通过指针相互连接。每个节点包含两部分:元素和指向下一个节点的指针。其中,最简单的形式是单向链表,每个节点含有一个信息域和一个指针域&…

夜莺监控发布 v8.beta5 版本,优化 UI,新增接口认证方式便于鉴权

以防读者不了解夜莺,开头先做个介绍: 夜莺监控,英文名字 Nightingale,是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化&#xff…

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用 目录 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用Embedding(嵌入)RAG(检索增强生成)Function calling(函数调用)Pr…

SQLMesh 系列教程5- 详解SQL模型

本文将详细介绍 SQLMesh 的 SQL 模型组成要素及其在实际项目中的应用。SQLMesh 是一个强大的数据工程工具,其 SQL 模型由 MODEL DDL、预处理语句、主查询、后处理语句以及可选的 ON VIRTUAL UPDATE 语句组成。我们将通过一个电商平台每日销售报告的实例,…

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代,AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选。今天,就让我们一起探索如何将DeepSeek接入PyCharm,实现高效、智…

从驾驶员到智能驾驶:汽车智能化进程中的控制与仿真技术

在汽车技术持续演进的历程中,人类驾驶员始终是一个极具研究价值的智能控制系统“原型”。驾驶员通过视觉感知、行为决策与操作执行的闭环控制,将复杂的驾驶任务转化为车辆的实际动作,同时动态适应道路环境的变化。这一过程不仅体现了高度的自…

Spring Boot项目的基本设计步骤和相关要点介绍

以下是一个关于Spring Boot项目的基本设计步骤和相关要点介绍,我们以一个简单的示例应用——员工管理系统为例进行说明: 一、项目概述 员工管理系统旨在实现对公司员工信息的有效管理,包括员工基本信息录入、查询、更新以及删除等功能。通过Spring Boot框架来快速搭建后端…

【Java】泛型与集合篇(一)

泛型与集合(一) 泛型泛型的核心作用泛型类型(类)定义与使用类型参数命名约定泛型方法定义与调用与泛型类的区别通配符上界通配符下界通配符有界类型参数类型擦除集合框架核心接口Collection 接口Map 接口Collection 接口操作的常用方法基本操作批量操作数组操作流操作方法L…

HarmonyOS组件之Tabs

Tabs 1.1概念 Tabs 视图切换容器,通过相适应的页签进行视图页面的切换的容器组件每一个页签对应一个内容视图Tabs拥有一种唯一的子集元素TabContent 1.2子组件 不支持自定义组件为子组件,仅可包含子组件TabContent,以及渲染控制类型 if/e…

华为FusionCompute虚拟化平台

一、华为FusionCompute虚拟化套件介绍 华为FusionCompute虚拟化套件是业界领先的虚拟化解决方案,能够帮助客户带来如下的价值,从而大幅提升数据中心基础设施的效率。 帮助客户提升数据中心基础设施的资源利用率;帮助客户成倍缩短业务上线周期…

使用apt-rdepends制作软件离线deb安装包

使用apt-rdepends制作软件离线deb安装包 除基础软件外,还要获取软件依赖包。 依赖包工具安装 apt-get install apt-rdependsapt-rdepends工具使用 使用apt-rdepends工具,递归方式分析软件依赖,下载软件包本体,和依赖包。制作时…

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑩】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10 作者:车端域控测试工程师 更新日期:2025年02月18日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-010测试用例 用例ID测试场景验证要点参考条款预期结果TC…

什么是Scaling Laws(缩放定律);DeepSeek的Scaling Laws

什么是Scaling Laws(缩放定律) Scaling Laws(缩放定律)在人工智能尤其是深度学习领域具有重要意义,以下是相关介绍及示例: 定义与内涵 Scaling Laws主要描述了深度学习模型在规模(如模型参数数量、训练数据量、计算资源等)不断扩大时,模型性能与这些规模因素之间的…

大一计算机的自学总结:前缀树(字典树、Trie树)

前言 前缀树&#xff0c;又称字典树&#xff0c;Trie树&#xff0c;是一种方便查找前缀信息的数据结构。 一、字典树的实现 1.类描述实现 #include <bits/stdc.h> using namespace std;class TrieNode { public:int pass0;int end0;TrieNode* nexts[26]{NULL}; };Tri…

【存储中间件API】MySQL、Redis、MongoDB、ES常见api操作及性能比较

常见中间件api操作及性能比较 ☝️ MySQL crud操作✌️ maven依赖✌️ 配置✌️ 定义实体类✌️ 常用api ☝️ Redis crud操作✌️ maven依赖✌️ 配置✌️ 常用api ☝️ MongoDB crud操作✌️ maven依赖✌️ 配置文件✌️ 定义实体类✌️ MongoDB常用api ☝️ ES crud操作 ⭐️…

51单片机入门_10_数码管动态显示(数字的使用;简单动态显示;指定值的数码管动态显示)

接上篇的数码管静态显示&#xff0c;以下是接上篇介绍到的动态显示的原理。 动态显示的特点是将所有位数码管的段选线并联在一起&#xff0c;由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选&#xff…