使用Pabot并行运行RF案例
一、问题引入
在做接口自动化时随着案例增多,特别是流程类案例增多,特别是asp.net的webform类型的项目,再加上数据库校验也比较耗时,导致RF执行案例时间越来越长,就遇到这样一个问题,705个接口测试案例(案例包含流程类案例,一个流程类案例可能包含3、4个单个案例,单个案例又都包含登录),通过Jenkins在单机上要跑13小时30分钟,而且目前还不是整个项目所有的接口测试案例,案例个数还在继续增长,一个系统假如有3、4000个接口那如果按照这个速度可能得跑一两天,这是很可怕的。
二、解决方案
于是就是在想有没有方法能缩短运行时间呢?一是将大的项目分成几个子模块,测试案例也是分为几个子模块,这样可以做分布式测试,二是进行并行测试,在一台机子上开启多个进程进行测试,最好的方案是一、二的结合,在网上搜了下,没想到已经有开源的类库Pabot。Pabot通过开启多个进程以Suite为单位并行运行RF测试案例,而且对于进程之间资源共享问题也有锁机制。它也兼容RF命令行参数,这样在Jenkins中修改之前RF命令也很容易,只需加几个参数就可以了。
三、测试
这里新建了一个PabotDemo,包含3个Suite,每个Suite中还有3个Test,每个Test都是执行相同的步骤sleep 10s,暂停10s。如果在RF中运行9个Test,每个Test耗时10s,那就需要90s。下图为在RF中运行的测试结果。

如果使用Pabot,开启多个进程并行运行案例,那就会减少运行时间,这里分别2个进程和3个进程。
2个进程:pabot --processes 2 PabotDemo,这里原本要90s的案例耗时63s。


3个进程:pabot --processes 3 PabotDemo,这里原本要90s的案例耗时32s。


上面简单测试了使用Pabot开启多个进程并行执行RF案例,这里没有进程间的资源共享,所以没加锁,具体使用可以参考:https://github.com/mkorpela/pabot。使用Pabot开启2个进程还是在原来单个执行机运行上面提到的705个测试案例,耗时减少5个小时,通过率也有提升,运行时间下降到8小时30分。
四、进一步优化
在开启2个进程并行运行705个案例减少5小时的运行时间,如果再多开启几个进程还是有下降的空间,除了多开几个进程外,还可以对案例进行优化。我们应该都下载过文件,有的大文件几个G,有的只有几M,小的文件很快下载完了,大的文件可能才刚开始,影响下载时间的关键因素可能就是几个大的文件,为了达到并行下载的目的,可以将大文件分为几个小文件,这样并行下载效果更好。由于Pabot并行运行是以Suite为单位运行的,因为项目的案例结构有的Suite中案例个数100多个,有的只有几个,这样就导致案例少的Suite几个可能已经运行完了,案例多的Suite可能才刚开始,并不能发挥并行运行的最大效果,分布不均,所以需要对案例进行调整,将案例多的Suite进行拆分,这样也能开启多个进程,不然总共有3个Suite开启5个进程,那也没用,还是只有3个进程在运行,上面只是举了下载文件的例子,还有好多整体与部分的关系,有点类似木桶原理。
五、优缺点
这里只是使用Pabot进行的接口案例执行,对于UI测试案例可能会杀浏览器进程的,这里没测是否能用Pabot进行测试。
六、总结
上面优化案例结构也是为了并行执行案例进行的优化,其实还有地方进行优化,比如登录,目前每个案例在执行时都会先进行登录,算是多了一个get和post请求,特别是那种json的,可能就是先get、post进行登录,然后就只有post请求就结束的,如果能模拟人的操作,同一个用户只登录一次,那效率应该也会有所提高,案例少的话可能不明显,案例多的话应该就会明显些。
使用Pabot并行运行RF案例的更多相关文章
- .NET下的并行开发(案例代码)
以下主要是通过一个报表处理程序来说明并行开发的方式.对于数据冲突和共享,可以通过对象数组解决.设计到并行的核心代码已用红色标出.在并行程序的处理上,需要把原来串行的子公司变成一个一个类的对象,让所有的 ...
- hadoop一代集群运行代码案例
hadoop一代集群运行代码案例 集群 一个 master,两个slave,IP分别是192.168.1.2.192.168.1.3.192.168.1.4 hadoop版 ...
- Robotframework(3):使用pycharm编写和运行RF脚本
转自:http://blog.csdn.net/ccggaag/article/details/77529724 我们在使用Robotframework时,经常编写脚本的人或许会不习惯,不过没关系!我 ...
- 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
Parallel类是.NET 4中新增的抽象线程类.如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例 ...
- Oozie_03运行官方案例【20161116】
3.1官方的案例 (1)Oozie根目录下找到 oozie-examples.tar.gz (2)解压tar -zxvf oozie-examples.tar.gz 生成example文件夹 [ha ...
- ansible之并行运行
ansible之并发运行 转载 2016年07月14日 12:33:39 标签: 并发 / ansible 4474 ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你 ...
- Parallel Programming-使用CancellationTokenSource调度并行运行的Task
本文主要介绍使用CancellationTokenSource调度并行运行的Task. 一.使用场景 有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Ta ...
- 运行RF测试案例,显示unable to open socket to "localhost:56505" error: [Errno 10061] 错误,且关闭RF卡死的解决办法
问题描述: 执行WEB ui测试案例后,执行请他的测试案例显示unable to open socket to "localhost:56505" error: [Errno 10 ...
- Android环境配置及运行helloWord案例
Android的环境搭建步骤,以及输出一个helloWorder 1:下载Android开发环境 及是: SDK adt-bundle-windows-x86_64-20140702 此时的版 ...
随机推荐
- [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creator【s
问题:执行创建函数的sql文件报错如下: [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA ...
- leetcode(java)
86 class Solution { public ListNode partition(ListNode head, int x) { ListNode lowheader=new ListNod ...
- $q的基本用法
angularjs的http是异步的没有同步,一般都会遇到一个场景,会把异步请求的参数作为条件执行下一个函数,之前一直在看其他人的博客理论太多看了很久才看懂 http({ method:'post', ...
- Redis Sentinel 模拟故障迁移
什么是redis sentinel 参考文档:https://redis.io/topics/sentinel 简单的来说,就是Redis Sentinel 为redis 提供高可用性,主要体现在下面 ...
- Html5与Css3知识点拾遗(九)
css布局 控制元素的显示类型和可见性 块级元素 dispaly:block: 行内元素(不能设置宽度) display:inline: 不接受padding设置,但padding-top和paddi ...
- java时间与js时间
这是一个由java获取的系统时间与js获取的系统时间不一致导致的测试缺陷 定义方式: java Date date = new Date(); js var Date date2 = new Date ...
- UEditor的jQuery插件化 -转
UEditor本身并不依赖jQuery,但如果在项目中同时使用两者的话,可能会希望使用jQuery语法创建和获取编辑器实例.为此,需要为jQuery编写插件,代码如下: (function ($) { ...
- hdu 1069 Monkey and Banana 【动态规划】
题目 题意:研究人员要测试猴子的IQ,将香蕉挂到一定高度,给猴子一些不同大小的箱子,箱子数量不限,让猩猩通过叠长方体来够到香蕉. 现在给你N种长方体, 要求:位于上面的长方体的长和宽 要小于 下面 ...
- Vuejs——(10)组件——父子组件通信
版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...
- Django Model 基础
程序涉及到数据库相关操作时,一般都会这样: 创建数据库,设计表结构和字段 使用 pymysql 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import pymysq ...