Android自动化测试工具调研

 常见的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一致。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章