八戒你干嘛 发表于 2017-6-28 15:19:32

简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本

一、前言

好久没写帖子,去年晋升为leader之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增加,执行自动化脚本的时间越来越长,而且感觉一台测试环境机器用跑一套用例比较浪费,所以这时候就应该要做并发自动化测试了
RobotFramework是有一个叫pabot的工具用来并发执行脚本的,但是不知道是不是我才疏学浅不太懂用pabot,发现它对测试用例执行并发的时候是遍历到测试套件的,但是一般情况下,一些相关性的测试套件是会放在不同的文件夹下,所以如果对文件夹进行并发执行的吧,那pabot就满足不了这个需求了,所以后来想到用批处理脚本的方法去实现这一需求
二、搭建过程

在testerhome上应该说过很多怎么用appium跑并发自动化,只是比较少说怎么结合robot来用,其实最关键的就是要设置不同设备的id,即udid,以及启动不同端口的appium server,假设当前的需求是同时跑两台设备(模拟器)
第一步:启动模拟器,查看当前设备
https://testerhome.com/uploads/photo/2017/73c1bef1819e41d3ee3052a48819b6eb.jpg!large
还是通过输入adb devices 查看一下当前设备的devicename,其实就是可以将devicename作为udid的值,之后在脚本的desired_caps当中填入udid=xxxx就好了

第二步:设备appium
首先是设置不同端口的appium server
https://testerhome.com/uploads/photo/2017/5fd4801949fc246bab1aba6d977e5d49.jpg!large
然后是Bootstrap Port也设置一下,注意不要用已经占用的端口号,devicename也可以设置一下
https://testerhome.com/uploads/photo/2017/eb53c8768c76fbec0c692b262ca51c20.jpg!large
设置完成之后启动appium(这里是2个)就好了
https://testerhome.com/uploads/photo/2017/3c175433ace1294f09f9a31718261186.jpg!large
第三步:批处理脚本编写
这里主要用到windows的批处理脚本作为执行Robot的pybot命令的基础,简单做起的话,有多少台模拟器就建多少个,当前可以参数化配置,这次就先以比较简单明了的方法先做了吧。
https://testerhome.com/uploads/photo/2017/6073e219f799450e7bb2a43d46cf8991.jpg!large
还有用到python的多线程来作为并发的主要执行脚本,实现也非常简单

具体的实现代码:

robot_mutil.py
#coding=utf-8
import threading
from time import ctime,sleep
import os


def run(arg):
   os.system(arg)

threads = []
cmd1="Start /wait robot_appium_1.bat"   #线程1执行的命令1
cmd2="Start /wait robot_appium_2.bat"   #线程2执行的命令1
cmd3="rebot --logtitle Lunkr4Android_TestLog --reporttitle Lunkr4Android_TestReport output1.xml output2.xml"#测试报告合并的命令3
t1 = 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的话,子进程一直未结束,合并测试报告的命令也不会执行,所以通过上面脚本之间的命令组合来使用有点巧妙的利用多线程的原理来实现并发自动化测试的操作,所以执行完成以后对看到生成对应的这些文件
https://testerhome.com/uploads/photo/2017/9103320d2220e235ec0673d21c1d472d.jpg!large
三、执行过程演示

具体的执行过程就是执行python脚本就好了,所以可以看看执行的效果
https://testerhome.com/uploads/photo/2017/1153900b39e6c82f6c5dccdddce035be.gif!large
就这样,并发的自动化测试就实现了,当然一般还是jenkins来做自动构建,所以这里有一个注意的地方,在执行后操作生成测试报告的时候,是需要获取全部的output.xml,所以在高级那里,用个模糊匹配配一下就好了
https://testerhome.com/uploads/photo/2017/39e042ad795d955f213eab4701b221a4.jpg!large
之后执行完成以后就能看到测试报告了
https://testerhome.com/uploads/photo/2017/72f2b851fd25d48de01c95b55f18a999.jpg!large
https://testerhome.com/uploads/photo/2017/009e7430f46197953d54f4d31b1bfab8.jpg!large
大致的过程就是这样子啦

四、最后说几句

上面描述的都是一些很简单但又是很核心的操作步骤,当然有些大牛有更好的方法,或者更多优化的地方,比如说用脚本自动配置端口启动appium,还是上面提到的脚本参数配置化等等,都可以,怎么高效怎么用就好,还有除了对一套用例分布执行之外,很多时候有需求说需要在不同的测试环境中去执行,如分别在Android6.0和Android7.0跑同套用例来覆盖系统版本,也是可以参照上面的方法去做的,再考虑一下如何安排测试数据和测试执行过程就可以了
其实上面也是描述的android端,这里提一下ios端,用模拟器是不可行的,一套xcode只能运行一台模拟器,所以ios端做并发的时候更多的要用到真机,但目前的话appium对接xcode8还很不稳定,包括在build webdriveragent到ios真机设备里面也一堆坑,现在我们测试团队在ios端的框架上也慢慢转到使用macaca,相对appium,macaca给我们的感觉是更高效,而且我们将macaca大致按照Robot的AppiumLibrary的方式集成了一个MacacaLibrary,可以结合Robot来之后,但目前还有bug,之后完成了可能会分享出来,到时再说吧,这次的分享就这样啦,谢谢大家,欢迎尽情地吐槽

乐哈哈yoyo 发表于 2017-6-28 16:59:00

可以考虑做多机远程并发的,像云测试一样,而且配脚本的方式可以再优化一下

草帽路飞UU 发表于 2017-6-28 16:59:09

大神有觉得 appium上执行用例特别慢 ,每一步都要5-6秒,并且不同实体机上速度也不一样,但不知道 慢的原因

八戒你干嘛 发表于 2017-6-28 17:00:29

乐哈哈yoyo 发表于 2017-6-28 16:59
可以考虑做多机远程并发的,像云测试一样,而且配脚本的方式可以再优化一下

好的,其实我还说漏了一点,Robot有个按标签执行用例的功能,这个就可以巧妙地用于分布执行,如用不同的标签分布到不同的机器或操作系统
页: [1]
查看完整版本: 简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本