一文3000字从0到1使用pytest-xdist实现分布式APP自动化测试

news2024/12/23 4:37:22

目录

01、分布式测试的原理

02、测试项目

03、环境准备

04、搭建步骤

05、分布式执行

06、测试报告


不知道大家有没有遇到这样一种情况,实际工作中,app自动化测试的用例可能是成百上千条的,如果放在一台机器上跑,消耗的时间非常久,那能不能使用分布式的来跑测试用例呢?比如有1000条测试用例,给A机器分配500个,给B机器分配500个,同时去跑,这样耗时就大大减少。刚好pytest-xdist为我们提供了一种可能

什么是pytest-xdist?

pytest-xdist是一款分布式测试插件。它在pytest的基础上做了一些独有的测试执行模式的扩展。比如你有多个CPU或者多台机器,就可以使用它们做一些并行化的测试,并且它还是跨平台的,可以指定不同的python解释器或不同的平台来执行测试

使用pip命令可以简单快速的安装pytest-xdist

pip install pytest-xdist

01、分布式测试的原理

上面有提到pytest-xdist实现分布式的方式有两种:一种是使用多CPU,一种是使用多台机器。

一般来说对于web自动化测试,使用多核CPU来做分布式比较合适,但对于app自动化测试来说,使用多台机器做分布式比较合适。这里主要介绍后者

pytest-xdist是工作方式是一个master对应多个worker,每个worker会按照master的要求来执行各自的测试集。

基本的执行流程为:

  • master在测试会话开始的时候会产生一个或多个worker。master和worker之间使用execnet及其网关进行通信。worker可以是本地的,也可以是远程的

  • worker作为pytest的执行者。在收集完一套完整的测试集后,worker将收集到的测试id发送给不承担执行任务的master

  • master接收所有节点发送来的结果,同时也会做一些可用性的检查以确保所有的worker都收集到相同的测试集。如果一切正常,它会将测试id列表转换为简单索引列表,每个索引对应着它在原始测试集列表中的位置。这种方案的可行性在于可以节约带宽,由于所有的worker都有相同的测试集列表,所以master可以指派其中一个worker只执行测试索引为3的用例

 pytest-xdist有两种模式,each模式和load模式 

  • each模式:

master会将所有的测试任务(这里的测试任务不是测试集,类似于测试指令,也就是上面说的测试索引)发送到每个worker上,每个worker都执行一遍完整的测试集。

举个例子,假如有1000条用例,分为A和B两个worker,那么A和B同时执行1000条用例

  • load模式:

master会先将25%的测试任务以轮询的方式发送给每个worker,剩下的等到worker执行完后再做分发。同样,有1000条用例,有A和B两个worker,那么先给A分发250个用例,再给B分发250条用例,剩下的500条用例等A和B执行完后再做分发,有可能此时A服务器的压力比较小,那么给A再分260条,B的压力比较大,给B再分240条。类似于负载均衡的概念

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

 

02、测试项目

以百度贴吧app为例,可以写简单的4条用例来测试。第一条测试的是欢迎页的滑动功能。如果用户点了同意,后面滑屏,能够正常滑动,点击立即体验,能够正常跳转,说明用例是通过的

  第二条测试的是欢迎页点击不同意,能够正常弹出提示,说明用例是通过的

第三条测试搜索,如果用户滑屏后,在主页搜索栏输入关键字,能够搜索到指定的内容,说明用例通过

  

最后一条测试登录,点击主页“我的”,能够进入到百度账号登录页面,说明用例通过

03、环境准备

在搭建环境上,我准备了三台虚拟机,其中一台作为master,剩下两台作为执行的worker。为了避免不必要的麻烦,三台机器都统一使用python3.8,两台worker上都使用docker安装appium1.17.0,客户端采用两台系统为v7.1.2的夜神模拟器。

具体信息如下表所示:

服务器环境

角色

系统

python版本

ip

master

Centos7.6

v3.8.0

192.168.0.109

worker1

Centos7.6

v3.8.0

192.168.0.126

worker2

Centos7.6

v3.8.0

192.168.0.136

客户端环境

测试机

系统

ip

tcpip

夜神模拟器-1

v7.1.2

192.168.0.114

6666

夜神模拟器-2

v7.1.2

192.168.0.106

6666

运行环境

容器

版本

端口号

宿主机器

appium_1

v1.17.0

4725->4723

worker1

appium_2

v1.17.0

4725->4723

worker2

04、搭建步骤

 1、在worker上创建并启动docker容器 

在两台worker上执行同样的操作,可以启动一个名为appium的容器

看到这里或许会问,docker里的appium服务是怎么启动的,比较简单,代码可以通过命令行的方式启动appium服务

 2、模拟器设置 

通过桥接的方式,设置tcpip端口,使得远程服务器可以通过adb连接到模拟器。具体方法是点开右上角的设置,进入系统设置,属性设置,勾选开启网络桥接模式,这时候应该会装一个桥接网卡,然后可以自己设置静态IP。保存后重启就可以了

正常情况下,重启后ip应该会变成静态IP,但是夜神模拟器有个bug,ip还是随机ip,不过这一点不影响后续的操作

接下来设置tcpip端口,通过如下命令设置好后,如果看到有restarting in TCP mode port:6666说明已经设置完成

 3、appium远程连接模拟器 

在两台worker上分别执行远程连接命令,worker1对应模拟器1,worker2对应模拟器2。这里要主要adb connect 后面跟的是模拟器的实际ip地址加tcpip端口号6666,如果看到connected to ip:端口号,说明已经远程连接成功

 4、上传代码 

使用命令或工具将代码上传到master上的/opt目录下并解压

main.py是项目测试执行的入口,为了适应分布式执行,我们需要对main.py做一些修改

对最关键的几步做一个说明:

  • "-d":

    表示分布式参数

  • "--tx"后面跟着worker服务器的地址

    且通过python=/opt/Python-3.8.0/bin/python3.8指定了python版本,通过chdir=/opt/pyexecnetcache指定了worker上同步测试集的目录,也就是master会将测试项目同步worker的该目录下

  • "--rsyncdir"后面跟"./",

    表示将master上当前目录下的所有文件都同步

  • "TieBa-AutoTest":

    因为同步过去的项目在pyexecnetcache目录下,实际上是/opt/pyexecnetcache/TieBa-AutoTest,如果不加该配置,就进入不到TieBa-AutoTest目录下,由于worker上的pytest执行时是找test_开头的测试用例,所以会找不到测试用例,可以将其理解为cd TieBa-AutoTest

05、分布式执行

在master上执行python3 main.py命令就可以做分布式运行,gw0和gw1分别表示worker1和worker2,[4]表示共有4条测试用例

此时去看worker的/opt目录下,已经同步到了测试项目

再去观察两台模拟器,发现已经开始同步执行了

06、测试报告

测试完成后,观察master上的执行结果信息,4条测试用例耗时不到3分钟,2条通过2条失败。

但是在master上通过allure serve生成预览报告后,发现报告是空的

两台worker上的报告预览展示正常,分别展示它们各自执行用例的报告信息

其原因是pytest-xdist对allure测试报告支持的不友好,各个worker的测试报告信息没有回传,使用pytest-html就没有这个问题。github上有人提出过这个问题。暂时留个“悬念”,下次再讲讲怎么解决这一问题

 如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦! 

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

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

相关文章

数据结构--算法、数据结构的基本概念

📕参考:王道 一、算法的基本概念 1.程序数据结构算法 2.算法的特性 (1)有穷性 执行有穷步之后结束,且每一步都可在有穷时间内完成。 (2)确定性 (3)可行性 可通过已经实…

深度学习基础知识 register_buffer 与 register_parameter用法分析

深度学习基础知识 register_buffer 与 register_parameter用法分析 1、问题引入2、register_parameter()2.1 作用2.2 用法 3、register_buffer()3.1 作用3.2 用法 1、问题引入 思考问题:定义的weight与bias是否会被保存到网络的参数中,可否在优化器的作用…

解决PlatformIO下载速度慢以及容易出错(解决vscode下载缓慢问题)

Content 问题描述:依赖下载缓慢问题解决:为vscode配置代理端口 问题描述:依赖下载缓慢 Arduino对于ESP32的开发提供了众多的库,但是Arduino IDE编译速度过于缓慢的问题属实让人难受。 为此我们使用vscode中的platformIO插件&…

斑馬打印機打印中文

创建项目 首先說一下,本文章是借鉴了其他大佬的文章,然后我记录一下的文章。 首先创建好一个.net framework的winform项目。 这里面主要用到两个库文件: Fnthex32.dll、LabelPrint.dll。 Fnthex32这个有8位参数和9位参数的,我这…

数据结构--》解锁数据结构中树与二叉树的奥秘(一)

数据结构中的树与二叉树,是在建立非线性数据结构方面极为重要的两个概念。它们不仅能够模拟出生活中各种实际问题的复杂关系,还常被用于实现搜索、排序、查找等算法,甚至成为一些大型软件和系统中的基础设施。 无论你是初学者还是进阶者&…

三角函数和角公式

该文章对三角函数和角公式做了多种证明:https://mp.weixin.qq.com/s?__bizMzI4ODYwNTM3Ng&mid2247484178&idx1&sn1f6e04c50ae30b63198201db3d9a4f05&chksmec3a96bddb4d1fab4baf8188ca6ba60d8d4364be4f08dc53e13b2e4cdfcec4fdb43928108001&scen…

10_9C++

X-mind #include <iostream> using namespace std; class Per { private:string name;int age;float *height;float *weight; public:Per()//无参构造函数{cout << "无参构造函数" << endl;}Per(string name,int age,float *height,float *weight)…

MySQL——单表与多表查询练习

MySQL 一、练习一二、练习二 一、练习一 这里首先将素材创建完毕&#xff0c;首先创建一个数据库并使用&#xff0c;这里我创建的数据库名为worker&#xff1a; 紧接着我们创建数据库表并创建表结构&#xff1a; 查看表结构&#xff1a; 接着我们导入数据&#xff1a; 这…

【LeetCode】剑指 Offer Ⅱ 第6章:栈(6道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案栈的应用剑指 Offer II 036. 后缀表达式模拟 栈 ⭐剑指 Offer II 037. 小行星碰撞分类讨论 栈 ⭐单调栈剑指 Offer II 038. 每日温度单调栈 ⭐剑指 Offer II 039. 直方图最大矩形面积单调栈…

Excel·VBA使用ADO合并工作簿

之前文章《ExcelVBA合并工作簿&#xff08;7&#xff0c;合并子文件夹同名工作簿中同名工作表&#xff0c;纵向汇总数据&#xff09;》处理合并工作簿问题&#xff0c;代码运行速度比较慢 而《ExcelVBA使用ADO读取工作簿工作表数据》读取数据非常快&#xff0c;那么是否可以使用…

vue3+elementui实现表格样式可配置

后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…

Redis安装及key、string操作

安装 在官网下载的数据包上传到Linux家目录 Install Redis from Source | Redis wget https://download.redis.io/redis-stable.tar.gz tar -xzvf redis-stable.tar.gz cd redis-stable make 编译后出现以下提示后输入make install 出现以下提示则安装成功 输入redis-sever启…

扩展屏幕,副屏幕的使用与设置

1、设置扩展屏模式 按快捷键 win p 选择 扩展 模式 2、设置屏幕的方向 打开电脑的设置页面 选择 系统 点击 屏幕&#xff0c;然后 拖动两个屏幕的位置即可

Computer Architecture Subtitle:Engineering And Technology

原文链接&#xff1a;https://www.cs.umd.edu/~meesh/411/CA-online/index.html

FBZP 维护支持程序 创建国家付款方式

今天在扩充供应商时报了一个错误&#xff1a; 收付方式 I 没有为国家 HK 定义。 原因是香港没有I的支付方式&#xff0c;需要为HK增加一下。方法如下&#xff1a; SPRO 路径&#xff1a;财务会计&#xff08;新&#xff09;-->>应收帐目和应付帐目-->>业务交易--&…

ELementUI之CURD及表单验证

一.CURD 1.后端CURD实现 RequestMapping("/addBook")ResponseBodypublic JsonResponseBody<?> addBook(Book book){try {bookService.insert(book);return new JsonResponseBody<>("新增书本成功",true,0,null);} catch (Exception e) {e.p…

基于Winform的UDP通信

1、文件结构 2、UdpReceiver.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace UDPTest.Udp {public class UdpStateEventArgs : EventArgs…

【C/C++】结构体内存分配问题

规则1&#xff1a;以多少个字节为单位开辟内存 就是说&#xff0c;该结构体最终所占字节大小&#xff0c;是这个单位的整数倍 给结构体变量分配内存的时候&#xff0c;会去结构体变量中找基本类型的成员 哪个基本类型的成员占字节数多&#xff0c;就以它大大小为单位开辟内存 …

数据产品读书笔记——数据产品经理和其他角色的关系

&#x1f34a;上一节我们初步对数据产品经理的角色有了初步的了解&#xff0c;今天我们继续学习数据产品经理与其他角色之间的关系。上一期的内容如下&#x1f447;: 链接: 数据产品读书笔记——认识数据产品经理 &#x1f340;当我们处在一个组织中&#xff0c;就一定会有与…

leetcode:2427. 公因子的数目(python3解法)

难度&#xff1a;简单 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b &#xff0c;则认为 x 是 a 和 b 的一个 公因子 。 示例 1&#xff1a; 输入&#xff1a;a 12, b 6 输出&#xff1a;4 解释&#xff1a;12 和 6 的公因…