当前位置:文档之家› android自动化测试之道

android自动化测试之道

Android自动化测试之道文/杨丰盛随着越来越多的手机厂商、运营商、开发商加入android阵营,带来了各种美化和定制的android系统,同时android market应用数量增长迅速。

这都离不开测试,android 自动化测试的需求愈加迫切。

测试主要分为白盒测试和黑盒测试两大类。

Android虽然在测试方面还不够完善,但也提供了各种途径来完成相应的测试模块。

白盒测试通常需要配合软件的源码来进行,测试人员须根据产品的功能和性能等需求编写测试用例,并根据测试用例逐一进行测试。

这里我们主要探讨在没有源码的情况下如何进行黑盒测试。

既然没有源码,那么我们就需要使用android所提供的工具包来获取应用程序上的各种UI元素,并向其发送各种操作事项。

此外,我们还可以借助各种开源项目,比如ASE等。

下面分别介绍几种目前最可行的自动化测试解决方案。

Android兼容性测试Android的各个版本之间都有不同程度的差异,因此google专门针对各个版本(android2.1以上)提供了兼容性测试工具CTS(compatibility test suite),其中共有两万多个测试用例,包括功能测试和性能测试等。

CTS最初只对OHA联盟开放,后来便和android开源项目一起发布了,并且所有手持设备都必须通过android兼容性测试,才能确保在android上开发的应用程序能够在android设备上运行,才能使用android market。

要使用CTS进行兼容性测试,就必须先下载和编译CTS,下载方式可以选择下载完整的android源码(位于$ANDROID/cts目录中)和只下载CTS源码(注:CTS源码下载地址为git:///platform/cts.git);然后可以使用如下命令来编译CTS://配置选项$ build/envsetup.sh//编译cts$ make cts编译完成之后会将结果输出到“$ANDROID/out/host/linux-x86/”目录中,然后可以启动模拟器或手持设备(需使用root权限来操作),并进入其bin目录。

使用“./cts”命令来启动CTS测试,显示CTS测试版本和设备连接状态,这时可以输入“help”命令来查看CTS的操作帮助信息。

如果输入“ls--plan”命令可以查看所有的plan(注:plan文件夹为cts/android-cts/repository/plans),在其中可以看到8个测试基类,比如android.xml、appsecurity.xml、CTS.xml等。

其中所有基类里包含的package都给出了相应的uri,cts 将根据这些uri去测试每个基类里的package,可以输入如下一些命令来测试某些package://测试所有cts测试用例Cts_host > start --plan CTS//测试android APICts_host > start --plan android//测试java核心库Cts_host > start --plan java通常在测试中很可能会出现错误,这时若需要知道是在哪一个plan处出错以及出错的原因,可以使用“-plan”、“-p”、“-t”、“-e”、“-w”等参数来指定某个测试用例,可以节约调试时间,如下命令可以指定测试alertdialog:Cts_host > start --plan Android -pAndroid.app -t android.app.cts.AlertDialogTest testAlertDialog当测试结束后,可以通过“ls-r”命令来查看测试的结果(注:CTS测试结果路径cts/android-cts/repository/results),如果觉得现有的测试用例不够完整,也可以根据现有的测试用例来添加自己编写测试用例,但需要注意每次添加或修改CTS任何模块都需要重新编译才能进行测试。

CTS主程序“bin/cts”是一个用sdb来测试的脚本程序,所有的测试用例都是用java 语言编写,其主程序为TestHost.java(注:CTS主函数为cts/tools/host/src/com/android/cts/TestHost.java)。

CTS是基于android instrumentation的测试,因此又是基于junit的测试,实际上也就是一套单元测试用例。

Android instrumentation测试Android整合了junit测试框架和instrumentation机制。

Junit是广泛应用于java程序开发中的单元测试框架,定义了特定格式的方法作为测试用例,提供testsuite测试套件和testrunner测试执行器分别用于组织测试用例和运行测试用例,并反馈测试结果。

Instrumentation则是一种操作系统和上层应用程序之间的监控机制。

当应用程序运行时,若instrumentation设置为开启,它将在应用程序运行前初始化,与应用程序运行在同一个进程中,监测应用程序与系统之间的交互,并对应用程序进行一定的控制,例如可以监控应用程序中个activity生命周期中的各个状态进行切换,甚至可以向activity发送按键事件和字符,图1展示了android中instrumentation测试的架构图1 android instrumentation架构图Instrumentation和activity有点类似,不同的是activity需要一个界面,而instrumentation并不需要,可以将它理解为一种没有图形界面的、具有启动能力的、用于监控其他类(用target package声明)的工具类。

在android中,有关测试的类都继承自test-case抽象类,它实际上就是对junit的instrumentation扩展,其中又包括了instrumentation testcase和android testcase,图2展示了详细的android instrumentation测试框架。

图2 android instrumentation测试框架当需要测试某个应用程序时,可以直接从上面的类中派生一个子类即可,例如,需要测试一个HelloWorld程序,其activity名称为HelloWorld,就可以创建一个集成自activitytestcase的子类HelloWorldtest来对其activity进行测试;其超类中提供了一些受保护的方法,例如setup()可以用来初始设置,如启动一个activity、初始化资源等;teardown()可以用来垃圾清理与资源回收。

编写完测试用例还需要修改androidmanifest.xml文件,首先需要引入测试库,并指明需要被测试的目标package,代码如下:<uses-library android:name = "android . Test.runner"/><instrumentation android:target package="com.yacin.HelloWorld"Android:name="android.test.instrumentationTestRunner"/>如果使用eclipse作为开发环境,便可以将android JUnit Test工具和eclipse进行继承,并在LogCat工具中打印日志信息。

Android instrumentation基本上可以测试大部分android API,但也有部分API不能被获取,如toas等;当遇到一些复杂的交互性测试比较难以实现,这时可以考虑模拟键盘、鼠标事件以及使用图像识别技术来完成自动化测试。

Android在操作系统层提供将键盘事件转化为应用程序动作的能力,一个事件的成功触响应需要如下几个步骤:首先,window manager接受来自于linux键盘驱动的按键事件;其次,window manager把scancode映射成keycode;再次,window manager把scancode和keycode都发给应用程序;最后,应用程序对按键事件进行响应。

因此可以通过“adb shell input/sendevent”命令来向设备发送键盘和触摸操作事件。

以下命令所发生的时间为在坐标(00000045,00000032)处点击屏幕,并且保持按下状态:Adb shell sendevent /dev/input/event0:0003 0000 00000045Adb shell sendevent /dev/input/event0:0003 0001 00000032Adb shell sendevent /dev/input/event0:0001 014a 00000001要实现自动化测试,就需要把上述操作都通过程序来自动完成,这时可以使用android工具包中的hierarchyview工具(hierarchyviewer.jar)或者其他脚本程序。

同事instrumentation中也提供了以send开头的函数接口来实现模拟键盘鼠标,如下代码所示://发送指定keycode的按键Sendcharactersync(int keycode)//发送指定keycode的按键Sendkeydownupsync(int key)//模拟touch事件Sendpointersync(MotionEvent event)//发送字符串sendstringSync(String text)如果使用图像识别技术进行检测,可以使用如下两种方案进行检测:1、利用系统viewserver中提供的接口获得当前界面上控件的属性信息,通过对比测试前后属性信息的变化进行结果校验;2、利用ddmlib包中提供的接口自动截取测试前后的屏幕截图,通过对比两幅截图相同位置的图像信息是否存在差异来进行结果校验。

无论是使用事件触发还是图像识别技术进行检测,都还需要完成大量的测试用例编写,以便能更好、更高效地完成自动化测试。

Android压力测试压力测试是任何一个应用程序和操作系统都必须完成的测试,android开发套件中专门为开发者提供了一个用来做压力测试的工具monkey。

它可以在模拟器和设备上运行,其原理是通过monkey产生随机脉冲,并随机产生大量时间对软件的负载能力进行测试。

Monkey是一个命令行工具,使用方法非常简单。

它提供四个基本的配置,分别是:基本配置选项,运行约束选项(如设置monkey只对单个包进行测试)、时间类型和频率、调试选项。

相关主题