一、前言
好久没写帖子,去年晋升为 leader 之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增加,执行自动化脚本的时间越来越长,而且感觉一台测试环境机器用跑一套用例比较浪费,所以这时候就应该要做并发自动化测试了
RobotFramework 是有一个叫pabot的工具用来并发执行脚本的,但是不知道是不是我才疏学浅不太懂用 pabot,发现它对测试用例执行并发的时候是遍历到测试套件的,但是一般情况下,一些相关性的测试套件是会放在不同的文件夹下,所以如果对文件夹进行并发执行的吧,那 pabot 就满足不了这个需求了,所以后来想到用批处理脚本的方法去实现这一需求
二、搭建过程
在 testerhome 上应该说过很多怎么用 appium 跑并发自动化,只是比较少说怎么结合 robot 来用,其实最关键的就是要设置不同设备的 id,即 udid,以及启动不同端口的 appium server,假设当前的需求是同时跑两台设备(模拟器)
第一步:启动模拟器,查看当前设备
还是通过输入adb devices 查看一下当前设备的 devicename,其实就是可以将 devicename 作为 udid 的值,之后在脚本的 desired_caps 当中填入 udid=xxxx 就好了
第二步:设备 appium
首先是设置不同端口的 appium server
然后是 Bootstrap Port 也设置一下,注意不要用已经占用的端口号,devicename 也可以设置一下
设置完成之后启动 appium(这里是 2 个)就好了
第三步:批处理脚本编写
这里主要用到 windows 的批处理脚本作为执行 Robot 的 pybot 命令的基础,简单做起的话,有多少台模拟器就建多少个,当前可以参数化配置,这次就先以比较简单明了的方法先做了吧。
还有用到 python 的多线程来作为并发的主要执行脚本,实现也非常简单
具体的实现代码:
robot_mutil.py #coding=utf-8import threading
from time import ctime,sleep
import os
def run(arg):
os.system(arg)
threads = []
cmd1="Start /wait robot_appium_1.bat" #线程1执行的命令1cmd2="Start /wait robot_appium_2.bat" #线程2执行的命令1cmd3="rebot --logtitle Lunkr4Android_TestLog --reporttitle Lunkr4Android_TestReport output1.xml output2.xml" #测试报告合并的命令3t1 = threading.Thread(target=run,args=(cmd1,))
threads.append(t1)
t2 = threading.Thread(target=run,args=(cmd2,))
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
t.join() #父进程等待子进程结束后再执行下去 os.system(cmd3) #执行命令3用rebot合并output1.xml和output2.xml,输出合并后的测试报告和日志 print "test finished"
首先说明一下命令中的start /wait,start /wait它的含义是:启动应用程序并等待它终止,用于调用多个应用程序时,指定:待该程序执行完后再执行下一个(排队执行)举个例子,一个文件夹中有很定系统补丁(按时间排序的)想依次安装完所有补丁,用 start /WAIT 就是最合适了,同样的我们分析一下脚本,首先是批处理文件的命令
robot_appium_1.bat pybot -o output1.xml -l log1.html -r report1.html ${TEST_FILE_PATH}&exit
robot_appium_2.bat pybot -o output2.xml -l log2.html -r report2.html ${TEST_FILE_PATH}&exit
脚本 1 和脚本 2 分别对应执行不同文件夹下的测试套件的命令,后面加个&exit,就是为了让脚本启动的测试用例执行完成后把子线程关掉,要所有的子进程都关掉之后,才会去执行合并测试报告的操作,如果不用 start /wait,python 脚本生成的子进程调用批处理脚本之后未等用例执行完成就会结束掉,这样就拿不到 output 生成报告了,同样的,如果一直在 wait,执行完测试用例之后没有 exit 的话,子进程一直未结束,合并测试报告的命令也不会执行,所以通过上面脚本之间的命令组合来使用有点巧妙的利用多线程的原理来实现并发自动化测试的操作,所以执行完成以后对看到生成对应的这些文件
三、执行过程演示
具体的执行过程就是执行 python 脚本就好了,所以可以看看执行的效果
就这样,并发的自动化测试就实现了,当然一般还是 jenkins 来做自动构建,所以这里有一个注意的地方,在执行后操作生成测试报告的时候,是需要获取全部的 output.xml,所以在高级那里,用个模糊匹配配一下就好了
之后执行完成以后就能看到测试报告了
大致的过程就是这样子啦
四、最后说几句
上面描述的都是一些很简单但又是很核心的操作步骤,当然有些大牛有更好的方法,或者更多优化的地方,比如说用脚本自动配置端口启动 appium,还是上面提到的脚本参数配置化等等,都可以,怎么高效怎么用就好,还有除了对一套用例分布执行之外,很多时候有需求说需要在不同的测试环境中去执行,如分别在 Android6.0 和 Android7.0 跑同套用例来覆盖系统版本,也是可以参照上面的方法去做的,再考虑一下如何安排测试数据和测试执行过程就可以了
其实上面也是描述的 android 端,这里提一下 ios 端,用模拟器是不可行的,一套 xcode 只能运行一台模拟器,所以 ios 端做并发的时候更多的要用到真机,但目前的话 appium 对接 xcode8 还很不稳定,包括在 build webdriveragent 到 ios 真机设备里面也一堆坑,现在我们测试团队在 ios 端的框架上也慢慢转到使用 macaca,相对 appium,macaca 给我们的感觉是更高效,而且我们将 macaca 大致按照 Robot 的 AppiumLibrary 的方式集成了一个 MacacaLibrary,可以结合 Robot 来之后,但目前还有 bug,之后完成了可能会分享出来,到时再说吧,这次的分享就这样啦,谢谢大家,欢迎尽情地吐槽