Instrumentation解析

已经在Android SDK中学习了很多关于JUnit的内容,但是感觉一直有几个问题没有解决(不知道大家是否有同样的感受)JUnit的测试都自动化的,完全是不需要任何操作的,有2个问题我一直都还没有找到答案,这2个问题如下:
1.JUnit可以用来测试Android的基本组成元素:Activity、Service、Provider,那么我们如何控制这些基本元素运行的,这需要Android系统提供一些底层操作的接口才可以做到。
2.如何模拟界面操作,比如说:单击界面上的按钮、选择菜单等。

对于第二个问题,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函数,例如:performClick(),看来Android SDK还是提供了一些这方面的函数来模拟各种操作。对于第一个问题,本篇对这个问题幅详细说明下。

首先我们先想下,如果要实现对Activity的测试需要些什么?首先需要创建Activity(这个Android SDK中已经提供了),然后可以控制Activity的生命周期,这些是最基本的。在Android SDK中说明过Activity的创建是异步的,也就是说当我们调用startActivty()后,这个函数立刻返回,而不是等待Activity创建好后才返回,这就需要一些同步方面的操作。将前面的概括起来就是2个方面:控制Activity的生命周期与同步方面的问题。Android SDK为我们提供了 instrument,在android.test包中InstrumentationTestCase 类有个函数getInstrumentation()以及通过adb shell am instrument启动测试例子的方法中,都提到了instrument,下面就对instrumentation详细说明。

[b][size=large]什么是Instrumentation?[/size][/b]

Instrumentation是执行application instrumentation代码的基类。当应用程序运行的时候instrumentation处于开启,Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的交互。Instrumentation implementation通过的AndroidManifest.xml中的标签进行描述。

Instrumentation似乎有些类似与window中的“钩子(Hook)函数”,在系统与应用程序之间安装了个“监听器”。

[b][size=large]android.app包中Instrumentation类结构,如下图所示[/size][/b]

[img]http://dl.iteye.com/upload/attachment/0071/4358/4aa52963-8efd-3f95-954e-1b8014e038b2.jpg[/img]

[b][size=large]其包含有2个内部类:ActivityMoniter、ActivityResult[/size][/b]
ActivityMoniter:有关特定的Intent的监视。一个ActivityMoniter类的实例通过函数addMonitor(Instrumentation.ActivityMonitor)添加到当前instrumentation中,一旦添加后,每当启动一个新的Activity,ActivityMoniter就会检测,如果匹配,其hit count计数更新等其他操作。 一个ActivityMonitor也可以用来寻找一个Activity,通过waitForActivity()方法,这个函数将返直到匹配的活动被创建。
ActivityResult:一个活动执行的结果说明,返回到原来的活动。

[b][size=large]然后我们看下Instrumentation类的函数,列举其主要函数如下:[/size][/b]
[b][size=large]添加、删除ActivityMoniter[/size][/b]

[img]http://dl.iteye.com/upload/attachment/0071/4397/a9ca6023-f108-302a-8ac8-d713421d25c3.jpg[/img]

[b][size=large]Application、Activity的创建与生命周期的控制[/size][/b]


[img]http://dl.iteye.com/upload/attachment/0071/4399/a24c3282-1ad3-3999-bb8a-492195a6c197.jpg[/img]

[b][size=large]控制Instrumentation的运行[/size][/b]


[img]http://dl.iteye.com/upload/attachment/0071/4401/33e89bbd-ff5c-3f4e-843f-ffb538d8c293.jpg[/img]


[b][size=large]发送按键、滚动球等事件消息到当前窗口[/size][/b]


[img]http://dl.iteye.com/upload/attachment/0071/4403/9cfb7558-6c5f-38b4-b0e3-2f25c6c14df9.jpg[/img]

[b][size=large]同步方面的操作[/size][/b]
1.创建一个Activity直到Activity开始运行;
2.在主线程中执行一个调用,主线程被阻滞直到调用结束 ;
3.当主线程空闲的时候(没有消息等待处理)执行一个调用;
4.同步等待主线程处于空闲期

[img]http://dl.iteye.com/upload/attachment/0071/4377/cbc0d326-06e6-3925-8ebe-d5b8d2790f80.jpg[/img]

你可能感兴趣的:(Instrumentation)