常见的Android测试框架
i.MonkeyRunner
l 什么是MonkeyRunner
MonkeyRunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过MonkeyRunner,可以写出一个Python程序去安装一个程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储。
MonkeyRunner工具的主要设计目的是用于测试功能水平上的应用程序和设备,或用于运行单元测试套件。运行使用的Python脚本可以使用MonkeyRunner录制或者手动编写。
l MonkeyRunner的测试类型
Ø 多设备控制
MonkeyRunner API可以跨多个设备或模拟器实施测试套件。可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。也可以用程序启动一个配置好的模拟器,运行一个或多个测试,最后关闭模拟器。
Ø 功能测试
MonkeyRunner可以为一个应用自动贯彻一次功能测试。
Ø 回归测试
MonkeyRunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
Ø 可扩展的自动化
由于MonkeyRunner是一个API工具包,可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用MonkeyRunner API之外,还可以使用标准的Python os和subprocess模块来调用Android Debug Bridge这样的Android工具。
l 如何使用MonkeyRunner
可以直接使用一个代码文件运行MonkeyRunner。不论使用哪种方式,都需要调用SDK目录的tools子目录下的MonkeyRunner命令。如果提供一个文件名作为运行参数,则MonkeyRunner将视文件内容为Python程序,并加以运行;否则,只能使用cmd来运行。
i. Monkey
l 什么是Monkey
AndroidSDK提供的命令行测试工具,可以运行在模拟器里或实际设备。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,检测程序多久的时间会发生异常。
l Monkey程序介绍
Ø Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar。
Ø Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;
l Monkey命令的简单帮助
要获取Monkey命令自带的简单帮助,在CMD中执行命令:
adb shellmonkey –help
l Monkey命令参数介绍
Ø 参数:-p
参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
* 指定一个包: adb shell monkey -pcom.htc.Weather 100说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
* 指定多个包:adb shell monkey -pcom.htc.Weather --p com.htc.pdfreader -p com.htc.photo.widgets 100
* 不指定包:adb shell monkey 100 说明:Monkey随机启动APP并发送100个随机事件。
Ø 参数:-v
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
日志级别 Level 0 示例 adb shell monkey -pcom.htc.Weather --v 100说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息。
日志级别 Level 1示例 adb shell monkey -pcom.htc.Weather --v -v 100说明 提供较为详细的日志,包括每个发送到Activity的事件信息。
日志级别 Level 2示例 adb shell monkey -pcom.htc.Weather --v -v --v 100说明 最详细的日志,包括了测试中选中/未选中的Activity信息。
* 示例:
Monkey测试1:adbshell monkey -p com.htc.Weather --s 100
Monkey 测试2:adbshell monkey -p com.htc.Weather --s 100 两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。
操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的。
Ø 参数:-throttle
用于指定用户操作(即事件)间的时延,单位是毫秒;
* 示例:adb shell monkey -p com.htc.Weather--throttle 3000
Ø 参数:-ignore-crashes
用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
* 示例1:adbshell monkey -p com.htc.Weather --ignore-crashes 1000测试过程中即使Weather程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止;
* 示例2:adbshell monkey -p com.htc.Weather 1000测试过程中,如果Weather程序崩溃,Monkey将会停止运行。
Ø 参数:-ignore-timeouts
用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
Ø 参数:-ignore-security-exceptions
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
Ø 参数:-kill-process-after-error
用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
Ø 参数:-monitor-native-crashes
用于指定是否监视并报告应用程序发生崩溃的本地代码。
Ø 参数:-pet{+事件类别}{+事件类别百分比}
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)参数使用说明:
示例:--pct-touch {+百分比}
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
adb shell monkey -p com.htc.Weather --pct-touch10 1000--pct-motion {+百分比}调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)
adb shell monkey -pcom.htc.Weather --pct-motion20 1000--pct-trackball {+百分比}调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
adb shell monkey -p com.htc.Weather--pct-trackball 30 1000--pct-nav {+百分比}调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
adb shell monkey -p com.htc.Weather --pct-nav40 1000--pct-majornav {+百分比}调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
adb shell monkey -p com.htc.Weather--pct-majornav 50 1000--pct-syskeys {+百分比}调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)
adb shell monkey -p com.htc.Weather--pct-syskeys 60 1000--pct-appswitch {+百分比}调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
adb shell monkey -p com.htc.Weather--pct-appswitch 70 1000--pct-anyevent {+百分比}调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等
adb shell monkey -p com.htc.Weather--pct-anyevent 50 --pct-appswitch 50 1000 指定多个类型事件的百分比
注意:各事件类型的百分比总数不能超过100%;
l Monkey和MonkeyRunner的区别
Ø Monkey:
Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。
Ø MonkeyRunner:
MonkeyRunner工具则是通过API定义的特定命令和事件控制设备或模拟器。
ii. Native Driver
l 编译源代码生成jar包
http://code.google.com/p/nativedriver/wiki/AndroidMakeAnAppTestable下载源代码,编辑生成jar包,肯定会用到的另两个jar包为server-standalone.jar和client-standalone.jar。两个jar包一个是用在server端,就是在被测应用中,一个是用在client端,就是我们写测试代码的测试程序中
l 被测应用加入jar包以及修改配置
把server-standalone.jar加入到被测的应用中,同时被测应用的AndroidManifest.xml文件中需要加入如下的权限
<instrumentation android:targetPackage="com.*.*"
android:name="com.google.android.testing.nativedriver.server.ServerInstrumentation"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
l 安装Apk
拿到了加入jar包和修改配置文件的apk文件之后必须的得安装了,我这边就安装在模拟器中安装命令:
adb install ****
通过查看nativedriver,该框架测试程序与被测应用的通信是通过http来进行的,server端会有一个jetty服务器来监听测试程序发送过去的命令,那必须的测试之前就需要启动服务了,进入cmd中,输入下面的命令即可:
Ø com.xxxxx是被测程序的包名,不同测试程序换一下即可:
adb shell am instrument com.*.*/cServerInstrumentation
Ø 启动的通信端口,默认的都是用的这个端口
adb forward tcp:54129 tcp:54129
这两条命令后续会放入到testng的beforesuite中
l 搭建测试程序
通过上面的步骤,被测程序已经被准备好。开始我们写测试程序,nativedriver通过http发送消息去server端,所以我们的测试程序新建的时候只需要新建一般的java工程即可,通过也不需要一定使用Junit,可以使用TestNG 来进行测试。通过eclipse新建一个一般的java工程,加入client-standalone.jar包,用于和server端进行通信,如果要用到TestNG当然还需要加入TestNG的jar包。
l 元素识别
登录功能一般就是输入用户名、密码,点击登录按钮。一般的UI自动测试的话很重要的一点就是元素的获取,android中提供了一个叫做hierarchyviewer的工具,可以识别android的控件元素,该工具是在android SDk安装路径的tools目录下,下面会有一个hierarchyviewer.bat文件。
l 运行
通过Eclipse编译,无须安装额外的APK,通过电脑端client向手机端发送http请求。
iii.Selenium
l 如何配置
下载Selenium IDE,用于在FireFox上录制Selenium脚本(html),并且可以将Selenium脚本(html)Export为JUnit 4 /WebDriver或其它语言的代码。
下载Test Suite Batch Converter,用于扩展Selenium IDE的Export功能。也是FireFox的plug。
下载selenium-server-standalone-2.25.0.jar,JUnit工程需要的libs。用于向WebDriver发送命令。
下载android-server-2.21.0.apk,安装在android手机上,用于接收、处理selenium客户端传来的各种命令。
打开FireFox,通过Selenium IDE录制测试脚本,保存为DemoDroid.html,并运行一下。然后在SeleniumIDE->File->Batch convert test cases->Java/ JUnit 4/ WebDriver,保存为DemoDroid.java。
新建一个java工程SeleniumDemo。导入libs(selenium-server-standalone-2.25.0.jar)。将DemoDroid.java 拷进src里。
安装android-server-2.21.0.apk到手机上(2.3.x以上)。并运行。在电脑上cmd输入:adb -s XXXXforward tcp:8080 tcp:8080在电脑上Run DemoDroid.java上Run as JUnit Test。
l 适用范围
基于手机浏览器的webview自动化测试,目前不支持客户端的自动化测试。
iv.基于Instrumentation
l Robotium
Robotium是一款测试Android App的测试框架,它使得编写黑盒测试代码更加容易和稳定。它其实是对android自带测试类Instrumentation的一个封装,方便于测试人员直接调用封装好的接口。通过使用Robotium,测试用例开发人员能够跨越多个Activity,开发出功能,系统以及验收测试用例。如果你能够拿到代码,你可以直接进行白盒测试,比如assert一下当前的activity,操作的结果对不对等等,都可以验证。对Instrumentation的引用实现对程序的控制,能够编写出功能强大,健壮性很强的黑盒测试用例。并且还能够跨越多个Activity进行测试。
实现方法:
1. 创建Android测试工程,
2. 修改AndroidMainfest.xml
3. 在测试类中增加setup/teardown方法
public Testcase001_Login() throws ClassNotFoundException {
super(Class.forName(Data.Init_Data.LAUNCHER_ACTIVITY_FULL_CLASSNAME));
}
@Override
public void setUp() throws Exception {
solo= new Solo(getInstrumentation(), getActivity());
}
4 .编写测试用例
public void testcase002_Login_WrongMail() {
username = Data.TestData.WRONG_USERNAME;
password = Data.TestData.PASSWORD;
assertTrue(loginfunction.Login_WrongMail(username, password));
}
5 .运行
Run AsAndroid Junit
v.淘宝Athrun
淘宝的开源测试框架,原理与Robotium类似,使用Android自身的Instrumentation框架实现对程序的控制。通过更加细致的封装,实现了更多的功能。
具体实现方法和Robotium一致。