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)相关推荐

  1. pytest学习笔记

    目录 1.虚拟环境准备 2.安装pytest 3.pytest使用约束 4.执行方式 5.pytest常用运行参数介绍 6.解决大批量执行测试case问题多进程 7.失败重跑机制(以下两种均可) 8. ...

  2. pytest学习:setup、teardown、setup_class、teardown_class的区别

    记录pytest 与 unittest内的前后置函数操作区别 pytest示例 setup_class:单个测试类开始前执行1次 setup:每个测试函数执行前执行1次 teardown:每个测试函数 ...

  3. pytest学习总结二:setup和teardown的使用总结

    介绍setup和teardown之前,先来介绍一个测试场景,比如我们要测试淘宝的购物车的添加功能,那我们是不是需要先登录,然后再到购物车模块去操作,最后是退出账号,那么像这种测试一个模块前后需要做的准 ...

  4. Pytest系列——allure(原理)之allure工具与Pytest测试框架集成

    官方介绍 1.Allure Framework是一种灵活的轻量级多语言测试报告工具,不仅可以以简洁的Web报告形式非常简洁地显示已测试的内容,也允许参与开发过程的每个人从日常测试中提取最大程度的有用信 ...

  5. pytest之执行测试pytest.main()的使用

    前言 pytest 运行用例的时候,一般用命令行去执行,可能是之前深受 unittest 框架的影响,习惯在项目的根目录下写一个 run_all.py 的文件.[使用pytest测试框架一般使用pyt ...

  6. python如何测试仪器_如何测试pytest设备本身?

    pytest有一个^{}插件,它是为了测试pytest本身和插件而设计的:它在一个独立的运行中执行不影响当前测试运行的测试.示例:# conftest.py import pytest pytest_ ...

  7. 【深度学习】Github 最受欢迎的深度学习项目 TOP 20

    必须做好一些是LINUX平台,甚至没有教材根本需要摸索学习的准备,如果有那个变成为在线服务的请第一时间通知我们 截止到 2017年 5月14日,Github 最受欢迎的深度学习项目 TOP 20 是哪 ...

  8. 深度学习笔记(20) 端到端学习

    深度学习笔记(20) 端到端学习 1. 端到端的深度学习概念 2. 语音识别的端到端学习 3. 人脸识别的端到端学习 4. 机器翻译的端到端学习 5. 非端到端 6. 端到端的优缺点 7. 端到端的关 ...

  9. 《游戏设计艺术(第2版)》——学习笔记(20)第20章 世界中的角色

    <游戏设计艺术(第2版)>学习笔记(20) 第20章 世界中的角色 游戏角色的本质 小说角色 电影角色 游戏角色 化身 理想型 白板 创造令人信服的游戏角色 角色窍门1:列出角色的功能 角 ...

最新文章

  1. 基于单目摄像头的BEV实例预测(ICCV 2021)
  2. 荣耀10 Turbo版将上线发布,游戏玩家欢呼的手游利器
  3. redis和kafka比较
  4. all方法 手写promise_实现Promise.allSettled
  5. PHP第三天!!黑人无表情 面向对象的特点等等!!
  6. 基于visual Studio2013解决面试题之0608找出两个只出现一次的数
  7. 如何通过JMX远程监控Solr?
  8. Android Studio查看aar文件内容
  9. 寒假第七周 2.22 --- 2.28
  10. 使用calibre搭建了一套电子图书系统
  11. python数学建模|综合评价方法
  12. java常用的组件和框架总结
  13. vscode 终端美化
  14. matlab 求公切线方程,【原创】绘制两圆公切线MATLAB代码
  15. 敲开bp神经网络之门(二,mfcc中使用,c#)
  16. ElasticSearch之 ik分词器详解
  17. 通过movie_id来查询数据库获取电影名字和平均得分
  18. n级阶梯,每次走一步或两步,问最多有多少种走法
  19. 计算机网络与协议分析,计算机网络-使用网络协议分析器捕捉和分析协议数据包...
  20. 12个View绘制流程高频面试题,震撼来袭免费下载!

热门文章

  1. Excel函数之datedif(计算两个日期之间的年或月或日)
  2. pregnanttube是什么格式 pregnanttube的9个知识点
  3. Kubernetes监控Heapster介绍
  4. 怎样做远程计算机控制系统,qq远程控制,怎样进行远程控制制作步骤
  5. Spring Boot 远程调试
  6. android 功能键菜单,Android菜单键和多任务键玩命 你帮谁?
  7. 数据结构:数组和链表的区别(数组和链表的优缺点 数组和链表的适用场景)
  8. win7无法正常关机的解决方法【系统天地】
  9. python grad_在Python中实现Adagrad
  10. 浅谈前端三大框架和vue2、vue3的选择