本文摘自evaFT的Android白盒测试之Instrumentation初探(一),http://blog.csdn.net/yiwaChen/article/details/52464635,感谢原创作者,如有侵权,请告知。
Google CTS测试基于Instrumentation设计
一、Instrumentation简介
Instrumentation是Android测试的核心框架,可使用它进行Android应用的单元测试和自动化测试。Instrumentation可以在主程序启动之前,创建模拟的Context;发送UI事件给应用程序;检查程序当前运行的状态;控制Android如何加载应用程序,控制应用程序和控件的生命周期;可直接调用控件的方法,对控件的属性进行查看和修改。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。
Instrumentation位于android.app包下,与Activity处于同级目录。它是Android系统里面的一系列控制方法的集合,俗称hook钩子。这些hook可以在正常的生命周期(正常的生命周期是指操作系统控制的生命周期)之外控制Android控件的运行。如,要启动某一待测activity,activity正常的生命周期是由Intent启动的,activity本身是无法调用生命周期中onCreate()、onStrart()等相关方法的;这时activity就可以调用Instrumentation API的getActivity()方法来启动activity。
图1
图2
Android的测试套件是基于JUnit的(如图3),Instrumentation则是针对Android系统的JUnit扩展。也就是说对于不涉及Android组件的项目,可直接通过JUnit进行单元测试,而对于调用了Android组件的项目可通过Instrumentation进行单元测试或自动化测试。
而对于Android白盒测试的新手来说,不熟悉Instrumentation的API的调用,可先使用android.test包中提供的AndroidTestCase类及系列子类来写一些通用的测试用例,其中最常用的一个类是ActivityInstumentationTestCase2。
图3
图4
二、创建测试用例
以下举一个测试activity最简单的例子来说明如何创建测试用例。
(一)创建Android项目
首先在eclipse中创建待测的Android项目,这个具体可参考Android基础开发的书籍,不详细介绍。(如图5)创建了项目InstruDemo。
图5
此项目只是为了测试用,暂且简单实现。(如图6、7)activity上只有一个textview用于展示一串文字。
图6
图7
(二)创建测试项目
在刚创建的Android项目上点击鼠标右键,选择“New->Other->Android Test Project”,创建测试项目InstruDemoTest。
图8
我们注意到,该测试项目的包名为com.eva.instrudemo.test,而被测项目(如图5)包名为com.eva.instrudemo,这就说明该测试项目InstruDemoTest是针对项目InstruDemo所设置的。
(三)查看配置文件
打开测试项目的AndroidManifest.xml,将会发现其包含<Instrumentation>标签,并自动将com.eva.instrudemo设为其targetPackage,即测试对象。
图9
(四)创建测试类
创建测试类ActiMainTest,并继承ActivityInstrumentationTestCase2<T>,将泛型T修改成待测的activity类名,在类中实现构造函数,否则会报错。
图10
图11
(五)实现测试用例
假设测试点是:应用程序中展示的字串文案(如图7)与预期是否相符,代码实现如下。
声明待测activity和控件对象。
图12
在setUp()中实例化对象。
图13
创建测试用例方法,方法名要以test做为前缀。
图14
由以上代码的结构可看出,这里很好地继承了JUnit框架设计(如图15)。
图15
(六)运行
将手机连接到电脑(或启用模拟器),在测试项目ActiMainTest上点击鼠标右键,在菜单Run As中选择Android JUnit Test。
注意Android测试API支持JUnit 3代码风格,而不支持JUnit 4代码风格,且只能通过InstrumentationTestRunner来运行测试用例。
1.运行测试一
运行结果(如图16),绿条,测试通过。
图16
2.运行测试二
修改代码中的预期结果为"evatest6.5.492_体验版",运行测试。
图17
运行结果(如图18),红条,测试不通过。可以看到Failure Trace提示了失败原因是实际结果[富途牛牛]与预期中的[evatest]不一致。
图18
(七)相关说明
示例代码,详见附件instrumentation_demo.7z。