一、问题引入
在做接口自动化时随着案例增多,特别是流程类案例增多,特别是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请求就结束的,如果能模拟人的操作,同一个用户只登录一次,那效率应该也会有所提高,案例少的话可能不明显,案例多的话应该就会明显些。