pytest学习和使用20-pytest如何进行分布式测试?(pytest-xdist)
20-pytest如何进行分布式测试?(pytest-xdist)
- 1 什么是分布式测试?
- 2 为什么要进行分布式测试?
- 2.1 场景1:自动化测试场景
- 2.2 场景2:性能测试场景
- 3 分布式测试有什么特点?
- 4 分布式测试关键技术是什么?
- 5 分布式执行用例的前置条件是什么?
- 6 pytest-xdist安装
- 7 pytest-xdist的优势
- 8 pytest-xdist的使用
- 8.1 普通执行
- 8.2 上述代码分布式执行:
- 8.3 指定CPU运行数量
- 8.4 与pytest-html一起使用
- 8.5 让pytest-xdist按照指定顺序执行
- 8.6 pytest-xdist如何保持session执行一次
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.1 in d:\python37\lib\site-packages (from pytest-xdist) (1.8.0)
Requirement already satisfied: pytest>=4.4.0 in 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.4 in 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.0 in 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.0 in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (1.4.0)
Requirement already satisfied: pluggy<1.0.0a1,>=0.12 in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (0.13.1)
Requirement already satisfied: py>=1.8.2 in d:\python37\lib\site-packages (from pytest>=4.4.0->pytest-xdist) (1.10.0)
Requirement already satisfied: importlib-metadata>=0.12 in 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.5 in 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.2 in 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 普通执行
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/3/16
# 文件名称:test_xdist.py
# 作用:pytest-xdist分布式测试
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelsonimport 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 in 9.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 in 4.51s ==============================================
8.3 指定CPU运行数量
-n auto
:可以自动检测到系统的CPU
核数;- 使用
auto
利用了所有CPU
来跑用例; - 也可以指定使用几个
CPU
来跑用例:
# x为cpu个数
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 in 6.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 in 4.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学习和使用20-pytest如何进行分布式测试?(pytest-xdist)相关推荐
- pytest学习笔记
目录 1.虚拟环境准备 2.安装pytest 3.pytest使用约束 4.执行方式 5.pytest常用运行参数介绍 6.解决大批量执行测试case问题多进程 7.失败重跑机制(以下两种均可) 8. ...
- pytest学习:setup、teardown、setup_class、teardown_class的区别
记录pytest 与 unittest内的前后置函数操作区别 pytest示例 setup_class:单个测试类开始前执行1次 setup:每个测试函数执行前执行1次 teardown:每个测试函数 ...
- pytest学习总结二:setup和teardown的使用总结
介绍setup和teardown之前,先来介绍一个测试场景,比如我们要测试淘宝的购物车的添加功能,那我们是不是需要先登录,然后再到购物车模块去操作,最后是退出账号,那么像这种测试一个模块前后需要做的准 ...
- Pytest系列——allure(原理)之allure工具与Pytest测试框架集成
官方介绍 1.Allure Framework是一种灵活的轻量级多语言测试报告工具,不仅可以以简洁的Web报告形式非常简洁地显示已测试的内容,也允许参与开发过程的每个人从日常测试中提取最大程度的有用信 ...
- pytest之执行测试pytest.main()的使用
前言 pytest 运行用例的时候,一般用命令行去执行,可能是之前深受 unittest 框架的影响,习惯在项目的根目录下写一个 run_all.py 的文件.[使用pytest测试框架一般使用pyt ...
- python如何测试仪器_如何测试pytest设备本身?
pytest有一个^{}插件,它是为了测试pytest本身和插件而设计的:它在一个独立的运行中执行不影响当前测试运行的测试.示例:# conftest.py import pytest pytest_ ...
- 【深度学习】Github 最受欢迎的深度学习项目 TOP 20
必须做好一些是LINUX平台,甚至没有教材根本需要摸索学习的准备,如果有那个变成为在线服务的请第一时间通知我们 截止到 2017年 5月14日,Github 最受欢迎的深度学习项目 TOP 20 是哪 ...
- 深度学习笔记(20) 端到端学习
深度学习笔记(20) 端到端学习 1. 端到端的深度学习概念 2. 语音识别的端到端学习 3. 人脸识别的端到端学习 4. 机器翻译的端到端学习 5. 非端到端 6. 端到端的优缺点 7. 端到端的关 ...
- 《游戏设计艺术(第2版)》——学习笔记(20)第20章 世界中的角色
<游戏设计艺术(第2版)>学习笔记(20) 第20章 世界中的角色 游戏角色的本质 小说角色 电影角色 游戏角色 化身 理想型 白板 创造令人信服的游戏角色 角色窍门1:列出角色的功能 角 ...
最新文章
- 基于单目摄像头的BEV实例预测(ICCV 2021)
- 荣耀10 Turbo版将上线发布,游戏玩家欢呼的手游利器
- redis和kafka比较
- all方法 手写promise_实现Promise.allSettled
- PHP第三天!!黑人无表情 面向对象的特点等等!!
- 基于visual Studio2013解决面试题之0608找出两个只出现一次的数
- 如何通过JMX远程监控Solr?
- Android Studio查看aar文件内容
- 寒假第七周 2.22 --- 2.28
- 使用calibre搭建了一套电子图书系统
- python数学建模|综合评价方法
- java常用的组件和框架总结
- vscode 终端美化
- matlab 求公切线方程,【原创】绘制两圆公切线MATLAB代码
- 敲开bp神经网络之门(二,mfcc中使用,c#)
- ElasticSearch之 ik分词器详解
- 通过movie_id来查询数据库获取电影名字和平均得分
- n级阶梯,每次走一步或两步,问最多有多少种走法
- 计算机网络与协议分析,计算机网络-使用网络协议分析器捕捉和分析协议数据包...
- 12个View绘制流程高频面试题,震撼来袭免费下载!
热门文章
- Excel函数之datedif(计算两个日期之间的年或月或日)
- pregnanttube是什么格式 pregnanttube的9个知识点
- Kubernetes监控Heapster介绍
- 怎样做远程计算机控制系统,qq远程控制,怎样进行远程控制制作步骤
- Spring Boot 远程调试
- android 功能键菜单,Android菜单键和多任务键玩命 你帮谁?
- 数据结构:数组和链表的区别(数组和链表的优缺点 数组和链表的适用场景)
- win7无法正常关机的解决方法【系统天地】
- python grad_在Python中实现Adagrad
- 浅谈前端三大框架和vue2、vue3的选择