Android白盒测试之Instrumentation

时间:2024-04-05 10:45:17

本文摘自evaFT的Android白盒测试之Instrumentation初探(一),http://blog.csdn.net/yiwaChen/article/details/52464635,感谢原创作者,如有侵权,请告知。

Google CTS测试基于Instrumentation设计


一、Instrumentation简介

InstrumentationAndroid测试的核心框架,使用它进行Android应用的单元测试和自动化测试。Instrumentation可以在主程序启动之前,创建模拟的Context;发送UI事件给应用程序;检查程序当前运行的状态;控制Android如何加载应用程序,控制应用程序和控件的生命周期;可直接调用控件的方法,对控件的属性进行查看和修改Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。


Instrumentation位于android.app包下,与Activity处于同级目录。它是Android系统里面的一系列控制方法的集合,俗称hook钩子。这些hook可以在正常的生命周期(正常的生命周期是指操作系统控制的生命周期)之外控制Android控件的运行。如,要启动某一待测activityactivity正常的生命周期是由Intent启动的,activity本身是无法调用生命周期中onCreate()onStrart()等相关方法的;这时activity就可以调用Instrumentation APIgetActivity()方法来启动activity

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图1

 

Android白盒测试之Instrumentation Android白盒测试之Instrumentation

图2

 

Android的测试套件是基于JUnit的(如图3),Instrumentation则是针对Android系统的JUnit扩展。也就是说对于不涉及Android组件的项目,可直接通过JUnit进行单元测试,而对于调用了Android组件的项目可通过Instrumentation进行单元测试或自动化测试。


而对于Android白盒测试的新手来说,不熟悉InstrumentationAPI的调用,可先使用android.test包中提供的AndroidTestCase类及系列子类来写一些通用的测试用例,其中最常用的一个类是ActivityInstumentationTestCase2


 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

3

 

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图4

 

二、创建测试用例


以下举一个测试activity最简单的例子来说明如何创建测试用例。


(一)创建Android项目


首先在eclipse创建待测的Android项目,这个具体可参考Android基础开发的书籍,不详细介绍。(如图5)创建了项目InstruDemo

Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation 

图5

 

此项目只是为了测试用,暂且简单实现。(如图67activity上只有一个textview用于展示一串文字。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图6

 

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图7

 

(二)创建测试项目


在刚创建的Android项目上点击鼠标右键,选择“New->Other->Android Test Project”,创建测试项目InstruDemoTest。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图8

 

我们注意到,该测试项目的包名为com.eva.instrudemo.test,而被测项目(如图5)包名为com.eva.instrudemo,这就说明该测试项目InstruDemoTest是针对项目InstruDemo所设置的。


(三)查看配置文件


打开测试项目的AndroidManifest.xml,将会发现其包含<Instrumentation>标签,并自动将com.eva.instrudemo设为其targetPackage,即测试对象

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图9

 

(四)创建测试类


创建测试类ActiMainTest,并继承ActivityInstrumentationTestCase2<T>,将泛型T修改成待测的activity类名,在类中实现构造函数,否则会报错。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图10

 

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图11

 

(五)实现测试用例


假设测试点是:应用程序中展示的字串文案(如图7与预期是否相符,代码实现如下。


声明待测activity和控件对象。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图12

 

在setUp()中实例化对象。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图13

 

创建测试用例方法,方法名要以test做为前缀。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

图14

 

由以上代码的结构可看出,这里很好地继承了JUnit框架设计(如图15)。

Android白盒测试之Instrumentation Android白盒测试之Instrumentation

15

 

(六)运行


将手机连接到电脑(或启用模拟器),在测试项目ActiMainTest上点击鼠标右键,在菜单Run As中选择Android JUnit Test


注意Android测试API支持JUnit 3代码风格,而不支持JUnit 4代码风格,且只能通过InstrumentationTestRunner来运行测试用例。


1.运行测试一


运行结果(如图16),绿条,测试通过。

 Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

16

 

2.运行测试二


修改代码中的预期结果为"evatest6.5.492_体验版",运行测试。

Android白盒测试之Instrumentation Android白盒测试之Instrumentation

图17

 

运行结果(如图18),红条,测试不通过。可以看到Failure Trace提示了失败原因是实际结果[富途牛牛]与预期中的[evatest]不一致。

Android白盒测试之InstrumentationAndroid白盒测试之Instrumentation

18

 

(七)相关说明


示例代码,详见附件instrumentation_demo.7z