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

2024-01-18 09:52

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618678

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者