超全整理,Pytest自动化测试框架-多进程(pytest-xdist)运行总结...

news2024/11/25 16:33:49

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完

当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一半,如果有10个小伙伴,那么执行时间就会变成十分之一,大大节省了测试时间

为了节省项目测试时间,10个测试同时并行测试,这就是一种分布式场景

分布式执行用例的原则:
用例之间是独立的,没有依赖关系,完全可以独立运行;
用例执行没有顺序要求,随机顺序都能正常执行;
每个用例都能重复运行,运行结果不会影响其他用例;

背景:

我们日常的工作当中进行自动化测试编写的测试用例会非常多,测试用例一个一个的执行所需要花费的时间会很长。

想象一下如果开发改动一块代码,我们需要回归一下,这时候执行一下自动化用例需要花费一小时或者好几个小时的时间,这是我们无法容忍的。

为了解决这个问题,我们采用pytest的插件pytest-xdist来进行多进程的并发执行测试用例,大大的缩短测试用例的执行时间,提高效率。

并发运行测试用例:

1、安装pytest-xdist

pip install pytest-xdist

2、多进程并发执行测试用例:不支持多线程

pytest test_add.py -n NUM    # NUM表示并发的进程数

参数配置:

-n=* :*代表进程数

说明:
①多cpu并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3
②-n auto : 自动侦测系统里的CPU数目
③-n num : 指定运行测试的处理器进程数

3、举例

项目结构如下:

在这里插入图片描述

代码:

# file_name: test_a.py
import pytest
import time


def test_a_01():
    print("----------------->>> test_a_01")
    time.sleep(1)
    assert 1


def test_a_02():
    print("----------------->>> test_a_02")
    time.sleep(1)
    assert 1


def test_a_03():
    print("----------------->>> test_a_03")
    time.sleep(1)
    assert 1


def test_a_04():
    print("----------------->>> test_a_04")
    time.sleep(1)
    assert 1


if __name__ == '__main__':
    pytest.main(["-s", "test_a.py"])
# file_name: test_b.py
import pytest
import time


def test_b_01():
    print("----------------->>> test_b_01")
    time.sleep(1)
    assert 1


def test_b_02():
    print("----------------->>> test_b_02")
    time.sleep(1)
    assert 1


def test_b_03():
    print("----------------->>> test_b_03")
    time.sleep(1)
    assert 1


def test_b_04():
    print("----------------->>> test_b_04")
    time.sleep(1)
    assert 1


if __name__ == '__main__':
    pytest.main(["-s", "test_b.py"])

①正常运行以上代码,耗时:8.09s

在这里插入图片描述

②设置并行运行数量为4,耗时:3.48s,大大的缩短了测试用例的执行时间。

A3

pytest-xdist分布式测试的原理

xdist的分布式类似于一主多从的结构,master机负责下发命令,控制slave机;slave机根据master机的命令执行特定测试任务。

在xdist中,主是master,从是workers。

大致原理:

1、xdist会产生一个或多个workers,workers都通过master来控制。

2、每个worker负责执行完整的测试用例集,然后按照master的要求运行测试,而master机不执行测试任务。

pytest-xdist分布式测试的流程

第一步:创建worker

master会在总测试会话(test session)开始前产生一个或多个worker。
master和worker之间是通过execnet和网关来通信的。
实际编译执行测试代码的worker可能是本地机器也可能是远程机器。

第二步:收集测试项用例

每个worker类似一个迷你型的pytest执行器。
worker会执行一个完整的test collection过程。【收集所有测试用例的过程】
然后把测试用例的ids返回给master。【ids表示收集到的测试用例路径】
master是不会执行任何测试用例集的。

注意:分布式测试(pytest-xdist)方式执行测试时不会输出测试用例中的print内容,因为主机并不执行测试用例,pycharm相当于一个master。

第三步:master检测workers收集到的测试用例集

master接收到所有worker收集的测试用例集之后,master会进行一些完整性检查,以确保所有worker都收集到一样的测试用例集(包括顺序)。

如果检查通过,会将测试用例的ids列表转换成简单的索引列表,每个索引对应一个测试用例的在原来测试集中的位置。

这个方案可行的原因是:所有的节点都保存着相同的测试用例集。

并且使用这种方式可以节省带宽,因为master只需要告知workers需要执行的测试用例对应的索引,而不用告知完整的测试用例信息。

第四步:测试用例分发

–dist-mode选项

each:master将完整的测试索引列表分发到每个worker。

load:master将大约25%的测试用例以轮询的方式分发到各个worker,剩余的测试用例则会等待workers执行完测试用例以后再分发

注意:可以使用pytest_xdist_make_scheduler 这个hook来实现自定义测试分发逻辑。

第五步:测试用例的执行

workers 重写了 pytest_runtestloop :pytest的默认实现是循环执行所有在test session这个对象里面收集到的测试用例。

但是在xdist里, workers实际上是等待master为其发送需要执行的测试用例。
当worker收到测试任务, 就顺序执行 pytest_runtest_protocol 。

值得注意的一个细节是:workers 必须始终保持至少一个测试用例在的任务队列里, 以兼容 pytest_runtest_protocol(item, nextitem) hook的参数要求,为了将 nextitem传给hook。

worker会在执行最后一个测试项前等待master的更多指令。

如果它收到了更多测试项, 那么就可以安全的执行 pytest_runtest_protocol ,因为这时nextitem参数已经可以确定。

如果它收到一个 "shutdown"信号, 那么就将 nextitem 参数设为 None, 然后执行 pytest_runtest_protocol

第六步:测试用例再分发(–dist-mode=load)

当workers开始/结束执行时,会把测试结果返回给master,这样其他pytest hook比如: pytest_runtest_protocol就可以正常执行。

master在worker执行完一个测试后,基于测试执行时长以及每个work剩余测试用例综合决定是否向这个worker发送更多的测试用例

第七步:测试结束

当master没有更多执行测试任务时,它会发送一个“shutdown”信号给所有worker。
当worker将剩余测试用例执行完后退出进程。
master等待所有worker全部退出。
然而此时仍需要处理诸如 pytest_runtest_logreport 等事件。

pytest实现多线程运行测试用例(pytest-parallel)

安装

pip install pytest-parallel

常用参数配置:

① --workers=n :多进程运行需要加此参数, n是进程数。默认为1
② --tests-per-worker=n :多线程需要添加此参数,n是线程数

如果两个参数都配置了,就是进程并行;每个进程最多n个线程,总线程数:进程数*线程数

注意:

①在windows上进程数永远为1。
②需要使用 if name == “main” :,在dos中运行会报错(即在命令行窗口运行测试用例会报错)

示例:

pytest test.py --workers 3 :3个进程运行
pytest test.py --tests-per-worker 4:4个线程运行
pytest test.py --workers 2 --tests-per-worker 4 :2个进程并行,且每个进程最多4个线程运行,即总共最多8个线程运行。

import pytest


def test_03():
    print('测试用例3操作')


def test_04():
    print('测试用例4操作')


if __name__ == "__main__":
    pytest.main(["-s", "test_b.py", '--workers=2', '--tests-per-worker=4'])

pytest-parallel与pytest-xdist对比说明:

① pytest-parallel 比 pytst-xdist 相对好用,功能支持多。
② pytst-xdist 不支持多线程;
③pytest-parallel 支持python3.6及以上版本,所以如果想做多进程并发在linux或者mac上做,在Windows上不起作用(Workers=1),如果做多线程linux/mac/windows平台都支持,进程数为workers的值。

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

无论遇到多少困难和挫折,都不能放弃自己的梦想。要相信自己有无限的潜力和能力,勇敢地追求自己的梦想,不断超越自我,最终就能够取得成功。

成功并不是一种目的,而是一种过程。勇敢地追求梦想,不断地超越自我,坚持不懈地努力下去,最终就能够实现自己的价值。

每个人都有自己独特的价值,要勇敢地追求自己的梦想,坚持不懈地努力下去,不断提升自己的能力,最终就能够实现自己的价值。

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

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

相关文章

在誉天学习华为认证,有真机吗

通过培训机构学习华为认证,特别是在HCIE的课程学习中,很多人关心的就是培训机构是否有真机能够进行华为认证的相关实验,今天我们一起来看看,在誉天学习华为认证,有真机吗? 誉天总部数据中心机房和誉天总部一…

获取微信小程序二维码

可直接通过微信扫描小程序二维码直接进入小程序,可用在分享推广业务。 目录 Curl请求方法 获取小程序token 获取小程序二维码 参数说明 注意 请求结果 Curl请求方法 需要请求微信小程序的API接口,封装好curl请求方法。 代码如下: /*…

西浦成立产业家学院破解 “产业级” 问题!AMT企源成首批合作机构

在推动高质量发展的国家战略背景下,从集成电路到人工智能,从新能源到绿色低碳,从健康养老到数字文创,无论国家还是区域都面临着产业转型升级或突破创新的发展需求, 这些 “产业级” 问题的难度远非单个企业层面问题可比…

C++泛型编程——模板(初识)

C泛型编程——模板(初识) 文章目录 C泛型编程——模板(初识)1. 泛型编程的概念2. 模板2.1 模板格式2.2 函数模板2.3 函数模板的实例化2.3.1 隐式(推演)实例化2.3.2 显式实例化 2.3 类模板3. 模板的本质 本章…

【教学类-36】八等分格子-A4竖版-4条(制作皇冠、戒指)

背景需求: 最近在大四班孩子中间普及铅画纸制作“方盒”的活动,目前进展到使用三条8等分的长条纸,制作一个“坚硬的、不漏底”的方盒。 实验后,我想试试如果缩小纸条长宽,是不是可以做“迷你”纸盒。 目的&#xff…

为什么别人年薪30W+?同样为测试人,“我“的测试之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试员&am…

可变形卷积 DeformConv2d

可变性卷积 前言为什么要用DConv普通卷积和与可变形卷积计算过程普通卷积计算过程Pytorch官方API可变形卷积计算过程 参考资源 前言 可变形卷积即DCN(缩写取自Deformable ConvNets)提出于ICCV 2017的paper: Deformable Convolutional Networks 论文pape…

【LLM之基座】qwen 14b-4int 部署踩坑

由于卡只有24G,qwen14b 原生需要 30GB,按照官方团队的说法,他们用的量化方案是基于AutoGPTQ的,而且根据评测,量化之后的模型效果在几乎没有损失的情况下,显存降低到13GB,妥妥穷狗福音&#xff0…

vue使用navigator.mediaDevices.getUserMedia调用相机功能

目录 前言: API: API简单示例: 拍照功能 实现效果: 前言: 本文将介绍Vue中如何使用navigator.mediaDevices.getUserMedia调用相机功能,实现拍照使用实例,需要的朋友可以参考一下。 注意…

02_SHELL编程之流程控制和循环语句

课程目标 熟悉流程控制语句基本语法,如if…else… 掌握for循环语句的基本语法结构 掌握while和until循环语句的基本语法结构 ###一、流程控制语句 ####1. 基本语法结构 F: false 假 T: true 真 if [ condition ];thencommandcommand fi ​ [ 条件 ] &&a…

NSSCTF第12页(3)

[NSSCTF 2nd]php签到 首先,代码定义了一个名为 waf 的函数,用于执行一个简单的文件扩展名检查来防止上传恶意文件。 $black_list 是一个存储不允许的文件扩展名的数组,如 “ph”、“htaccess” 和 “ini”。 pathinfo($filename, PATHINF…

拥抱开源生态,算能携手软件所 PLCT 实验室联合举办 RISC-V 软件移植优化锦标赛

(引言)为推动RISC-V软件生态加速发展,算能作为RISC-V生态的领先企业,与RISC-V 中国社区、中科院软件所PLCT实验室联合发起“RISC-V软件移植及优化锦标赛”活动,以桌面和服务器软件生态为重点,在编译器、运行…

2023-11-17 LeetCode每日一题(最大和查询)

2023-11-17每日一题 一、题目编号 2736. 最大和查询二、题目链接 点击跳转到题目位置 三、题目描述 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 ,另给你一个下标从 1 开始的二维数组 queries ,其中 queries[i] [xi, yi] 。 对于…

SOLIDWORKS参数化设计之主参数设置

SOLIDWORKS参数化设计是通过主参数来驱动整个模型的变化,因此确定主参数是很重要的部分。主参数可以是数值,也可以是条件,可以手动输入,也可以做成下拉列表。今天我们就来看看主参数的下拉列表是如何做到的。 SolidKits.AutoWork…

近期局势较多变化 适合黄金代理入场吗?

进入本年的四季度后,中东局势出现了比较大的变化。首先,巴以冲突不断的加剧,而且马来西亚的林吉特出现大幅贬值,甚至有市场论调认为,亚洲金融危机可能会重新点燃。从这个角度来说,整体的市场环境是很动荡的…

波卡三季度报告:已实现白皮书目标,异步支持与应用链技术推进

作者:Nicholas Garcia,Messari 研究分析师 编译:OneBlock 来源:https://messari.io/report/state-of-polkadot-q3-2023 知名分析平台 Messari 发布了 Polkadot 2023 年第三季度报告,分析了波卡的关键数据指标以及网…

【蓝桥杯选拔赛真题23】C++计算24 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

C/C++计算24 第十二届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 “计算 24”是一个流传已久的数字游戏,小蓝最近对此痴迷不已 游戏规则是:从 1~10 之间的自然数任意拿出 4 个数(4 个数各不相同,顺序随机),进行加、减、乘三种运算(使用某种运算…

0基础如何学习软件测试?10分钟给你安排明白

先上一张学习路线: 在测试行业已经呆了5年多了,也算得上行业经验资深了吧,基本上也是摸清了这个行业的发展。 所以今天也想对有转行想法的朋友分享一下经验,能够让你对这个行业有个大致的了解和对以后的发展有所规划,…

9.3 【MySQL】系统表空间

了解完了独立表空间的基本结构,系统表空间的结构也就好理解多了,系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页面,所以会比独立…

Android Proguard混淆

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、语法规则3.1 输入/输出选项3.2 保留选项3.3 缩…