android自动化测试之道
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 API
Cts_host > start --plan android
//测试java核心库
Cts_host > start --plan java
通常在测试中很可能会出现错误,这时若需要知道是在哪一个plan处出错以及出错的原因,可以使用“-plan”、“-p”、“-t”、“-e”、“-w”等参数来指定某个测试用例,可以节约调试时间,如下命令可以指定测试alertdialog:
Cts_host > start --plan Android -p
Android.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,代码如下: