当前位置: 首页 > news >正文

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试?

  • 在进行本文之前,先了解些基础知识,什么是分布式测试?
  • 分布式测试:是指通过局域网和Internet,把分布于不同地点、独立完成特定功能的测试计算机连接起来,以达到测试资源共享、分散操作、集中管理、协同工作、负载均衡、测试过程监控等目的的计算机网络测试。
  • 通俗的讲:分布式测试 就是活太多,一个人干费时间,那就让多个人一起干,节省了资源和时间。

2 为什么要进行分布式测试?

2.1 场景1:自动化测试场景

自动化测试时,我们有很多用例,比如2000条用例,按照顺序执行,每条用例执行1分钟,那需要2000分钟;

什么概念?2000分钟就30多个小时,如果是冒烟测试,估计还没人工跑的快;

还有,如果是线上发布,跑完2000条用例就太浪费时间了;

那如果我们让我们让用例分布式执行,是不是可以节省很多时间?

2.2 场景2:性能测试场景
  • 如果数据量很大,我们使用1台压测机,可能并发压力过大;

  • 那就需要选择使用多台压测机(比如Jmeter的 Agent/负载机);

  • 这样也是一种分布式压测或者分布式性能测试场景。

所以总结来说,其实就是为了提升效率和质量。

3 分布式测试有什么特点?

特点说明
网格化多节点互联互通,可资源共享
分布性地域和计算机上,协同工作、负载均衡、可扩展性、高可用性
开放性可移植性、可互操作性、可伸缩性、易获得性
实时性各种信息都必须是实时的
动态性测试过程对象和活动动态映射
处理不确定性具有处理不确定性的能力
容错及安全性容错能力强,可靠性高、安全性好

4 分布式测试关键技术是什么?

技术点要求
分布式环境获取全局状态,能够方便地监视和操纵测试过程;集中式的分布式策略。
分布式环境下的节点通信稳定的通信环境;适合用基于消息通信的方式来实现。
测试任务调度静态调度、动态调度和混合调度。

5 分布式执行用例的前置条件是什么?

  • 用例之间是独立且没有依赖关系,完全独立运行;

  • 用例执行没有顺序,随机顺序都能正常执行;

  • 每个用例都能重复运行,运行结果不会影响其他用例。

6 pytest-xdist安装

  • pytest-xdist让自动化测试用例分布式执行,节省测试时间,属于进程级别的并发;

  • 使用以下方法安装:

pip3 install pytest-xdist
C:\Users\Administrator>pip3 install pytest-xdist
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: pytest-xdist in d:\python37\lib\site-packages (1.31.0)
Requirement already satisfied: six in d:\python37\lib\site-packages (from pytest-xdist) (1.15.0)
Requirement already satisfied: execnet>=1.1in d:\python37\lib\site-packages (from pytest-xdist) (1.8.0)
Requirement already satisfied: pytest>=4.4.0in d:\python37\lib\site-packages (from pytest-xdist) (6.2.4)
Requirement already satisfied: pytest-forked in d:\python37\lib\site-packages (from pytest-xdist) (1.1.3)
Requirement already satisfied: apipkg>=1.4in d:\python37\lib\site-packages (from execnet>=1.1->pytest-xdist) (1.5)
Requirement already satisfied: toml in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (0.10.2)
Requirement already satisfied: attrs>=19.2.0in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (20.3.0)
Requirement already satisfied: colorama in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (0.4.4)
Requirement already satisfied: atomicwrites>=1.0in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (1.4.0)
Requirement already satisfied: pluggy<1.0.0a1,>=0.12in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (0.13.1)
Requirement already satisfied: py>=1.8.2in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (1.10.0)
Requirement already satisfied: importlib-metadata>=0.12in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (2.1.1)
Requirement already satisfied: packaging in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (20.8)
Requirement already satisfied: iniconfig in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (1.1.1)
Requirement already satisfied: zipp>=0.5in d:\python37\lib\site-packages (from importlib-metadata>=0.12->pytest>=4.4.0->pytest-xdist) (1.2.0)
Requirement already satisfied: pyparsing>=2.0.2in d:\python37\lib\site-packages (from packaging->pytest>=4.4.0->pytest-xdist) (2.4.7)

7 pytest-xdist的优势

  • 测试运行并行化;

  • 在子进程中重复运行测试;

  • 可指定不同的Python解释程序或不同的平台,并行运行测试。

8 pytest-xdist的使用

8.1 普通执行
import pytest
import timeclass TestCase01():def test_case_01(self):time.sleep(1)print("case01$$$$$$$$$$$$$$$$$$$$$")def test_case_02(self):time.sleep(1)print("case02$$$$$$$$$$$$$$$$$$$$$")def test_case_03(self):time.sleep(1)print("case03$$$$$$$$$$$$$$$$$$$$$")def test_case_04(self):time.sleep(1)print("case04$$$$$$$$$$$$$$$$$$$$$")def test_case_05(self):time.sleep(1)print("case05$$$$$$$$$$$$$$$$$$$$$")def test_case_06(self):time.sleep(1)print("case06$$$$$$$$$$$$$$$$$$$$$")class TestCase02():def test_case_07(self):time.sleep(1)print("case07$$$$$$$$$$$$$$$$$$$$$")def test_case_08(self):time.sleep(1)print("case08$$$$$$$$$$$$$$$$$$$$$")def test_case_09(self):time.sleep(1)print("case08$$$$$$$$$$$$$$$$$$$$$")if __name__ == '__main__':pytest.main(["-s", "test_xdist.py"])

执行结果如下,使用了9.14s:

test_xdist.py::TestCase01::test_case_01 
test_xdist.py::TestCase01::test_case_02 
test_xdist.py::TestCase01::test_case_03 
test_xdist.py::TestCase01::test_case_04 
test_xdist.py::TestCase01::test_case_05 
test_xdist.py::TestCase01::test_case_06 
test_xdist.py::TestCase02::test_case_07 PASSED                           [ 11%]case01$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 22%]case02$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 33%]case03$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 44%]case04$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 55%]case05$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 66%]case06$$$$$$$$$$$$$$$$$$$$$
PASSED                           [ 77%]case07$$$$$$$$$$$$$$$$$$$$$test_xdist.py::TestCase02::test_case_08 PASSED                           [ 88%]case08$$$$$$$$$$$$$$$$$$$$$test_xdist.py::TestCase02::test_case_09 PASSED                           [100%]case08$$$$$$$$$$$$$$$$$$$$$============================== 9 passed in9.14s ==============================
8.2 上述代码分布式执行:
  • 执行命令:

pytest -s -n auto test_xdist.py
  • 结果如下,用时4.51s,可见分布式执行后大大缩短了测试时间:

(venv) F:\pytest_study\test_case\test_j>pytest -s -n auto test_xdist.py
============================================ test session starts =============================================
platform win32 -- Python 3.7.0, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: F:\pytest_study, configfile: pytest.ini
plugins: allure-pytest-2.8.12, assume-2.4.3, cov-2.8.1, forked-1.1.3, html-2.0.1, metadata-1.8.0, ordering-0.6,repeat-0.9.1, rerunfailures-10.3, xdist-1.31.0
gw0 [9] / gw1 [9] / gw2 [9] / gw3 [9] / gw4 [9] / gw5 [9] / gw6 [9] / gw7 [9]
.........
============================================= 9 passed in4.51s ==============================================
8.3 指定CPU运行数量
  • -n auto:可以自动检测到系统的CPU核数;

  • 使用auto利用了所有CPU来跑用例;

  • 也可以指定使用几个CPU来跑用例:

  1. # x为cpu个数

  2. pytest -s -n x

  • 如下可以看到使用两个CPU来跑用例时长为6.27s:

(venv) F:\pytest_study\test_case\test_j>pytest -s -n 2 test_xdist.py
============================================ test session starts =============================================
platform win32 -- Python 3.7.0, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: F:\pytest_study, configfile: pytest.ini
plugins: allure-pytest-2.8.12, assume-2.4.3, cov-2.8.1, forked-1.1.3, html-2.0.1, metadata-1.8.0, ordering-0.6,repeat-0.9.1, rerunfailures-10.3, xdist-1.31.0
gw0 [9] / gw1 [9]
.........
============================================= 9 passed in6.27s ==============================================
8.4 与pytest-html一起使用
  • 命令如下:

pytest -s -n auto --html=report.html --self-contained-html
  • 运行结果:

pytest -s -n auto test_xdist.py --html=report.thml --self-contained-htm
l
gw0 [9] / gw1 [9] / gw2 [9] / gw3 [9] / gw4 [9] / gw5 [9] / gw6 [9] / gw7 [9]
.........
------------------ generated html file: file://F:\pytest_study\test_case\test_j\report.thml ------------------
============================================= 9 passed in4.68s ==============================================

8.5 让pytest-xdist按照指定顺序执行
  • pytest-xdist执行默认是无须的;

  • 可通过 --dist 参数来控制顺序;

参数说明
--dist=loadscope同一个模块module下的函数和同一个测试类class下的方法来分组
--dist=loadfile同一个文件名来分组
8.6 pytest-xdist如何保持session执行一次
  • pytest-xdist没有内置的支持来确保会话范围的夹具仅执行一次;

  • 可使用FileLock方法仅仅产生一次fixture数据:

import pytest
from filelock import FileLock@pytest.fixture(scope="session")
def login():print("====登录===")with FileLock("session.lock"):name = "zhang"password= "123456"# web ui自动化# 声明一个driver,再返回# 接口自动化# 发起一个登录请求,将token返回都可以这样写yield name, passwordprint("====退出====")

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

相关文章:

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试&#xff1f; 在进行本文之前&#xff0c;先了解些基础知识&#xff0c;什么是分布式测试&#xff1f;分布式测试&#xff1a;是指通过局域网和Internet&#xff0c;把分布于不同地点、独立完成特定功能的测试计算机连接起来&#xff0c;以达到测试资源共享…...

虚拟ip可以解决所有的安全问题吗

虚拟IP&#xff08;Virtual IP&#xff09;是一种网络技术&#xff0c;可以把多台物理服务器或设备组合成一个逻辑集群&#xff0c;并且使用同一个IP地址对外提供服务。虚拟IP具有负载均衡、故障切换和高可用性等优势&#xff0c;同时还可以作为一种安全措施来增加系统的抗攻击…...

【数据库原理】(27)数据库恢复

在数据库系统中&#xff0c;恢复是指在发生某种故障导致数据库数据不再正确时&#xff0c;将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起&#xff0c;包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性&#xff0c;数…...

施工企业工程管理信息化、智能化需求分析

一、引言 随着科技的飞速发展&#xff0c;信息化、智能化技术正在逐步改变各行各业的工作方式。对于施工企业而言&#xff0c;传统的工程管理方式已难以满足现代工程项目的复杂需求。为了提高效率、降低成本并确保工程的安全与质量&#xff0c;施工企业工程管理迫切需要进入信…...

Centos7 安装与卸载mysql

卸载 ps ajx | grep mysql &#xff1a; 查看当前服务器是否有mysql 没有的话就不需要卸载咯。 centos7 通过yum下载安装包通常是以.rpm为后缀&#xff0c;rpm -qa 可以查看当前服务器上所有的安装包&#xff1a; rpm -qa | grep mysql | xargs yum -y remove :将查询到的mysql…...

ASP.NET Core 的 Web Api 实现限流 中间件

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制&#xff08;限流&#xff09;中间件。 它是.NET 7 以上版本才支持的中间件&#xff0c;刚看了一下&#xff0c;确实挺好用&#xff0c;下面给大家简单介绍一下&#xff1a; RateLimiterOptionsExtensions 类提供下列用…...

Mysql字段的各种时间类型

DATE: 特点&#xff1a;存储日期&#xff0c;不包含时间。示例&#xff1a; CREATE TABLE example_date (id INT PRIMARY KEY, event_date DATE ); INSERT INTO example_date (id, event_date) VALUES (1, 2023-01-11); TIME: 特点&#xff1a;存储时间&#xff0c;不包含日…...

Armv8-R AArch32 architecture概念学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。阅读该文章&#xff0c;可以先查看AArch64 Exception Model学习&…...

linux手动安装 vscode-server

适用场景 很多时候&#xff0c;我们需要在本机&#xff08;比如windows&#xff09;通过remote ssh访问远程服务器&#xff08;一般是ubuntu&#xff09;&#xff0c;但经常出现 vscode 一直连不上远程服务器的情况&#xff0c;看一下 log&#xff1a; 这个log表示远程服务器…...

【Maven】009-Maven 简单父子工程搭建

【Maven】009-Maven 简单父子工程搭建 文章目录 【Maven】009-Maven 简单父子工程搭建一、需求说明1、结构2、第三方库 二、工程搭建1、父工程第一步&#xff1a;创建父工程第二步&#xff1a;引入公共依赖 lombok 和管理 hutool 依赖版本 2、公共子模块第一步&#xff1a;创建…...

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路&#xff08;状态机实现&#xff09;分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路&#xff08;状态机实现&#xff09; module Detect_101(input clk,input rst_n,input data,o…...

What is `addArgumentResolvers` does in `WebMvcConfigurer` ?

addArgumentResolvers 在SpringMVC框架中&#xff0c;主要用于向Spring容器注册自定义的参数解析器。在处理HTTP请求时&#xff0c;SpringMVC会使用这些参数解析器将请求中的数据&#xff08;如查询参数、路径变量、表单数据等&#xff09;转换并注入到控制器方法的参数中。 使…...

[NSSCTF Round#16 Basic]RCE但是没有完全RCE

RCE但是没有完全RCE wp 题目代码&#xff1a; 第一关 <?php error_reporting(0); highlight_file(__file__); include(level2.php); if (isset($_GET[md5_1]) && isset($_GET[md5_2])) {if ((string)$_GET[md5_1] ! (string)$_GET[md5_2] && md5($_GET[m…...

LTD营销枢纽(乐通达)成为杭州市中小企业数字化转型遴选服务商

为推进国家中小企业数字化转型城市试点建设&#xff0c;赋能中小企业信息化、智能化、新型工业化能力水平提升&#xff0c;杭州市经信局公开招募了具备高质量服务能力的中小企业数字化转型服务商。经过公开征集、专家评审等多个环节&#xff0c;LTD营销枢纽凭借其在数字化转型领…...

详细分析Mybatis中的<foreach>标签

目录 前言1. 基本语法2. Demo3. 实际例子 前言 对于Java专栏&#xff1a;Java专栏 对于Mybatis的相关知识可看我之前的文章&#xff1a;Mybatis从入门到精通&#xff08;全&#xff09; 对于其余Java框架可看我之前的文章&#xff1a;java框架 零基础从入门到精通的学习路线 附…...

linux-挂载Samba共享

linux-挂载Samba共享 1、linux服务器启动Samba共享服务 2、客户端电脑安装cifs-utils dnf install cifs-utils # 或 yum install cifs-utils3、挂载共享目录 # 创建挂目录 mkdir /share # 使用mount命令挂在共享目录&#xff0c;-t协议类型 -o用户名密码 共享目录访问地址 挂…...

Java入门IDEA基础语法

1&#xff1a;Java入门 1.1 Java简介 Java是什么&#xff1a; Java是一门非常优秀的计算机语言 语言&#xff1a;人与人交流沟通的表达方式 计算机语言&#xff1a;人与计算机之间进行信息交流沟通的一种特殊语言 Java之父&#xff1a;詹姆斯高斯林&#xff08;James Gosli…...

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提&#xff1a;电脑已安装Mysql服务&#xff1b; Visual Studio 安装Mysql依赖库&#xff1a; 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索&#xff0c; 安装Mysql.Data (Oracle); (安装成功后&…...

Django登录注销视图

Django在身份验证框架中包含了一些你可以直接使用的表单和视图。在大多数情况下&#xff0c;可以使用默认的Django认证视图。 Django在django.contrib.auth.views提供了以下基于类的视图来处理身份验证&#xff1a; LoginView&#xff1a;处理登录表单并登录用户 LogoutView&a…...

云原生到底是什么意思

云原生到底是什么意思&#xff1f; 引言 随着云计算技术的迅速发展&#xff0c;云原生成为了一个备受关注的话题。云原生不仅仅是一种新的软件架构&#xff0c;更是一种变革性的开发方法论。本文将深入解析云原生的意义、特点以及为什么它在现代软件开发中变得如此重要。 云…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...