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

terrychow · February 26, 2017 · Last by aiyanyuan replied at October 27, 2017 · 3716 hits

一、前言

  • 好久没写帖子,去年晋升为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-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) #执行命令3rebot合并output1.xmloutput2.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,之后完成了可能会分享出来,到时再说吧,这次的分享就这样啦,谢谢大家,欢迎尽情地吐槽
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 17 条回复 时间 点赞

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

小红薯 回复

好的,其实我还说漏了一点,Robot有个按标签执行用例的功能,这个就可以巧妙地用于分布执行,如用不同的标签分布到不同的机器或操作系统

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

阿森 回复

appium是特别的慢,有个数据可以参考,ios端100个robot用例可以跑2个多小时的,我后面也粗略去了解了一下,看到好像说appium代码复杂度比较高,功能大而全,处理请求的性能相对就低下了,而且按照c/s模式来实现的话,也会收到请求响应速度以及用例本身处理速度的影响,所以我们也慢慢转向用macaca了

不错的分享

陈子昂 回复

谢谢

谢谢分享

terrychow 回复

你们现在公司使用的是macaca是吧

阿森 回复

逐渐再推,目前是我们团队用


请问下,构建这里大神你是怎么写的命令呢?Jenkins集成时,appium窗口打开,怎么能自动打开debug模式,而不用每次都去点开始呢?

terrychow #13 · April 02, 2017 作者
红发 回复

用命令直接构建就好了,输入参数来debug吧,然后有一点的我们端口号是参数化的,用来适应多机并发

terrychow 回复

可以方便贴下命令吗?怎么个输入参数法debug呢,能写个例子吗,捉急

terrychow #15 · April 04, 2017 作者
红发 回复

appium --debug ,然后之后端口号的定义的话参考文中的脚本的做法参数化就好

求助大神,我按照你的设置怎么打开appium还是只有一个啊

aiyanyuan 回复

我是用命令行打开的o

什么命令打开的呢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up