[陈学亮 武娟 庞涛 钱锋 刘晓军]
Android应用并行自动化测试技术研究与实现
[陈学亮 武娟 庞涛 钱锋 刘晓军]
文章对Android平台主流的自动化测试技术例如Monkey、MonkeyRunner、Robotium、Appium进行了研究与分析,基于Appium跨平台、跨进程、跨应用等优点,提出了一套基于Appium的并行自动化测试方案,通过集成TestNG测试框架实现测试脚本在多个Android设备并行运行,实现了Android应用的并行自动化测试,能够充分提升测试效率,弥补人工测试存在的缺陷。
Android 并行 自动化 Appium TestNG
陈学亮
硕士,就职于中国电信股份有限公司广东研究院,工程师,主要研究方向为Android自动化测试、Android应用技术等。
武娟
硕士,中国电信股份有限公司广东研究院,高级工程师,主要研究方向为云计算、大数据技术等。
庞涛
硕士,中国电信股份有限公司广东研究院,工程师,主要研究方向为智能家居、新型网络技术等。
钱锋
硕士,中国电信股份有限公司广东研究院,工程师,主要研究方向为大数据、云游戏、虚拟现实技术等。
刘晓军
硕士,中国电信股份有限公司广东研究院,工程师,主要研究方向为应用虚拟化技术、多媒体等。
随着移动互联网行业的快速发展,近年来以Android为代表的智能手机用户呈现高速增长的趋势,根据权威机构统计,截止2015年底中国的智能手机用户已超过5亿。相应的Android应用程序也日趋丰富,目前Google的Android应用市场已有上百万个应用,并且仍然保持快速增长和滚动更新。
Android应用的质量(例如易用性、稳定性、可靠性等)决定了应用在用户群中的口碑和体验,因此对应用进行各项测试是应用开发商、开发者、应用市场提供商、终端厂商、运营商的一项重要工作。由于Android系统存在碎片化、机型众多的问题,每推出一款新的Android应用,或者发布新版本,往往需要适配多个Android版本(例如4.x、5.x、6.x)和数百款机型,若采用传统的人工测试需要大量的时间和人力成本,效率较低,难以满足应用敏捷开发、快速迭代和上线发布的要求。
本文基于现有的热门开源工具和框架,研究Android应用程序的并行自动化测试技术,目标是实现应用程序在多款手机设备上根据预先编写的测试脚本,同时进行自动化测试并输出结果,从而大幅度缩短测试时间,降低测试成本,提高测试的准确性和效率。
2.1 Monkey工具
Monkey是Android SDK自带的一个测试工具,通常用于模拟向应用程序发送各种随机的输入消息(例如屏幕点击、按键输入、手势输入等),验证应用在海量、长时间的随机性输入下是否会出现闪退或崩溃,主要用于应用的压力测试。Monkey的使用非常简单,在PC上可通过adb命令启动,直接在Android设备或模拟器上执行,例如:
$adb shell monkey -p com.gstar.compare -v -v 10000
其中-p com.gstar.compare指定了Monkey需要启动的应用程序包,-v –v是设置命令行输出测试信息的级别为2(输出最详细的信息),10000是发送随机消息的次数,当测试成功执行完毕会输出测试结果统计(包括事件次数,事件类型,运行时间等数据),如图1。
图1 Monkey测试结果统计
而测试遇到异常崩溃时会输出相应的日志信息,例如下面碰到了一个空指针的异常(包含异常方法名称、代码位置,便于程序员迅速定位异常原因),如图2。
图2 Monkey测试异常信息
2.2 MonkeyRunner工具
MonkeyRunner是Android SDK自带的另一个测试工具,相比Monkey而言,MonkeyRunner可通过Python语言编写测试脚本,在测试用例中通过坐标位置、控件ID、控件名称等方式控制应用的界面元素,弥补了Monkey只有简单命令,无法进行复杂逻辑处理等方面的缺陷。MonkeyRunner采用了C/S架构,在PC端逐行解释Python代码并发送到Android设备执行,其脚本可通过手工编写或录制/回放方式自动生成。MonkeyRunner适合用于功能测试和回归测试,它可以为一个应用自动贯彻一次功能测试,在脚本中设定按键或触摸事件的输入数值,观察比对输出结果,验证应用功能的正确性。测试脚本示例如下:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice //引入monkeyrunner模块
device = MonkeyRunner.waitForConnection() //连接并绑定Android设备
device.installPackage(“d:\ compare.apk “) //指 定APK安装文件路径
device.startActivity(component = “ com.gstar.compare/com.gstar.compare.main.ActivityMain “) //启动应用
mr.sleep(3.0) //等待3秒
device.type(‘helloworld’) //输入字符串helloworld
device.press(‘KEYCODE_ENTER’) //输入回车
…………
result = device.takeSnapshot() //屏幕截图
result.writeToFile(‘./shot1.png’,’png’) //指定路径保存截图
2.3 Robotium框架
Robotium是一款开源的Android自动化测试框架,对Android原生的Instrumentation测试框架进行了二次封装,主要针对Android应用进行黑盒自动化测试,可提供模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对Activity、Dialog、Toast、Menu等各类控件进行操作。由于基于Instrumentation的测试用例需要和被测应用运行在同一个进程里,除非应用是调试版本(与测试用例一样使用调试版密钥签名),否则需要对应用进行重新打包签名。重新打包签名可使用re-sign.jar工具,首先将原APK去除签名并重新打包为APK文件,然后用公钥重新签名:
keytool -genkey -v -keystoreandroid.keystore -alias android.keystore -keyalg RSA -validity 20000
jarsigner -verbose -keystoreandroid.keystore -signedjarandroid_signed.apkandroid.apkandroid.keystore
Robotium测试用例采用Java语言编写,代码结构和Instrumentation类似,通过Solo对象的实例创建各类事件进行测试,setUp方法用于初始化,tearDown方法用于结束测试,test方法完成测试,结构如下:
2.4 Appium框架
Appium也是一款开源的自动化测试框架,它采用C/ S架构,客户端用于封装WebDriver API,读取用各种语言编写的测试脚本并转换为测试命令发给服务端,服务端使用Node.js搭建HTTP Sever接受测试指令并发送给测试目标,服务端可以部署在本地或云端。Appium在底层使用Android的自动化测试框架进行测试,Android 4.2.1以上版本使用UiAutomator框架,低版本使用Instrumentation以及Selendroid框架。Appium工作原理如图3。
图3 Appium架构
相比Robotium,Appium框架具备以下优点:
(1)跨平台,支持Android、iOS、Firefox OS等平台的应用测试;
(2)服务端也是跨平台的,可以部署在Windows、Linux或者Mac OS X上;
(3)跨应用,支持原生应用、混合应用、Web应用测试;
(4)跨进程,不受Instrumentation限制,可以在多个进程间进行测试,应用无需重新签名;
(5)跨语言,基于Appium独特的解释机制,可以支持Java、JS、Python、Ruby、PHP等多种语言。
由于Appium具备跨平台、跨应用、跨进程等优点,本文主要基于Appium研究并行自动化测试方案。Appium采用C/S架构,因此可建立多个Server对应每台测试设备,同时进行测试。例如两台设备并行测试则启动2个Appium Server,分别配置好IP地址(本机则为127.0.0.1)和端口号(例如4723和4725),同时集成TestNG框架实现并行测试,TestNG是一个开源的测试框架,通过将测试信息添加到TestNG的xml配置文件中能够实现并行测试,关键步骤如下:
(1)通过adb devices命令获取测试设备标识符UDID
(2)项目路径下新建testng.xml文件,代码如下:
(3)执行测试命令(需配置环境变量):
通过在TestNG的xml配置文件中写入设备标识UDID、Appium服务器IP地址和端口号,程序会自动在对应的设备上运行Appium服务器解释后的测试代码,实现多设备的并行自动化测试,运行结束后可在测试设备和命令窗口查看测试结果。
随着Android系统版本滚动更新,Android机型日益丰富,相应的Android应用也是层出不穷,对Android应用进行测试是一项不可或缺的任务,而传统的人工测试存在大量重复性的工作,测试效率不高并且精确性较低。本文对当前主流的Android自动化测试工具和框架进行了研究与分析,提出了一套基于Appium集成TestNG测试框架的并行测试方案,通过该方法能够实现Android应用在多台设备并行完成自动化测试,可以有效提高测试效率,减少人工干预,测试脚本可复用,具有很强的实用性和指导意义。
1 谢红霞,吴红梅.基于Android的自动化测试的设计与实现[J].计算机时代.2012,(02):20-22
2 张立芬,周悦,郭振东.Android移动应用测试[J].中国新通信,2013,(03):84-86
3 陈昊.Android手机自动化测试系统的设计与实现[D].西安电子科技大学,2014
4 宋春雨.Android平台自动化测试的研究与实践[D].北京邮电大学,2012
5 白凯,崔冬华.基于JUnit自动化单元测试的研究[J].计算机与数字工程,2010,(02):52-54,103
6 邓青华.软件自动化测试工具研究[J].软件导刊,2011,(01):57-59
10.3969/j.issn.1006-6403.2016.11.001
(2016-08-17)