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

terrychow · 2017年02月26日 · 最后由 aiyanyuan 回复于 2017年10月27日 · 5402 次阅读

一、前言

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

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

小红薯 回复

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

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

阿森 回复

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

不错的分享

陈子昂 回复

谢谢

谢谢分享

xinxjxjxj 回复

😁 😁

terrychow 回复

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

阿森 回复

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


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

红发 回复

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

terrychow 回复

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

红发 回复

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

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

aiyanyuan 回复

我是用命令行打开的 o

什么命令打开的呢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册