Instrumentation框架介绍-Android自动化测试系列(三)

这篇里面主要介绍一下Instrumentation框架以及其实现原理、相关的工具类以及驱动类,介绍一下框架中主要的组成部分。

Instrumentation框架介绍

Android测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以

  • 在主程序启动之前,创建模拟的系统对象,如Context;
  • 控制应用程序的多个生命周期;
  • 发送UI事件给应用程序;
  • 在执行期间检查程序状态。

###Instrumentation 原理

当你运行一个测试程序时,首先会运行一个系统工具叫做Activity Manager。Activity Manager使用Instrumentation框架来启动和控制TestRunner,这个TestRunner反过来又使用Intrumentation来关闭任何主程序的实例,然后启动测试程序及主程序(同一个进程中)。这就能确保测试程序与主程序间的直接交互。

Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation不需要,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类的工具类。

如何指定被测应用

通过在测试工程的manifest文件中添加元素来指定要测试的应用程序。例如:

<instrumentation
   android:name="com.example.wegame.test.MSDKTestInstrumentationTestRunner"
   android:targetPackage="com.example.wegame" />

这个元素的特性指明了要测试的应用程序包名targetPackage,以及告诉Android如何运行测试程序。

##Instrumentation TestCase类

继承自JUnit TestCase类,并可以使用Instrumentation框架,用于测试Activity。使用Instrumentation,Android可以向程序发送事件来自动进行UI测试,并可以精确控制Activity的启动,监测Activity生命周期的状态。

基类是InstrumentationTestCase。它的所有子类都能发送按键或触摸事件给UI。子类还可以注入一个模拟的Intent。

子类有:

  • ActivityTestCase Activity测试类的基类。
  • SingleLaunchActivityTestCase 测试单个Activity的类。它能触发一次setup()和tearDown(),而不是每个方法调用时都触发。如果你的测试方法都是针对同一个Activity的话,那就使用它吧。
  • SyncBaseInstrumentation 测试Content Provider同步性的类。使用它Instrumentation在启动测试同步性之前取消已经存在的同步对象
  • ActivityUnitTestCase 对单个Activity进行单一测试的类。使用它,你可以注入模拟的Context或Application,或者两者。它用于对Activity进行单元测试。不同于其它的Instrumentation类,这个测试类不能注入模拟的Intent。
  • ActivityInstrumentationTestCase2 在正常的系统环境中测试单个Activity的类。你不能注入一个模拟的Context,但你可以注入一个模拟的Intent。另外,你还可以在UI线程(应用程序的主线程)运行测试方法,并且可以给应用程序UI发送按键及触摸事件

##Instrumentation TestRunner

Android提供了自定义的运行测试用例的类,叫做InstrumentationTestRunner。这个类控制应用程序处于测试环境中,在同一个进程中运行测试程序和主程序,并且将测试结果输出到合适的地方。IntrumentationTestRunner在运行时对整个测试环境的控制能力的关键是使用Instrumentation。而且即使你的测试类不使用Instrumentation,你也可以使用这个TestRunner。

当你运行一个测试程序时,首先会运行Activity Manager。Activity Manager使用Instrumentation框架来启动和控制TestRunner,这个TestRunner反过来又使用Intrumentation来关闭任何主程序的实例,然后启动测试程序及主程序(同一个进程中)。这就能确保测试程序与主程序间的直接交互。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Lighttpd1.4.20源码分析之状态机(1)---状态机总览

http://www.cnblogs.com/kernel_hcy/archive/2010/03/24/1694203.html

871
来自专栏微信公众号:Java团长

Spring知识点提炼

Sping的容器可以分为两种类型 1. BeanFactory:(org.springframework.beans.factory.BeanFactory接...

1282
来自专栏Android群英传

Andromeda:适用于多进程架构的组件通信框架(下)

1032
来自专栏扎心了老铁

zookeeper curator使用caches实现各种监听

1、篇首语 curator是zookeeper的一个高级api开发包。封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要...

5305
来自专栏冷冷

Spring 必知概念(二)

13、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要...

2089
来自专栏Java架构师学习

Spring面试底层原理的那些问题,你是不是真的懂Spring?

3834
来自专栏ImportSource

像Spring Boot那样创建一个你自己的Starter

如果你所在的公司要开发一个共享的lib,或者如果你想要为开源世界做点贡献,你也许想要开发你自己的自定义的自动配置类以及你自己的starter pom。这些自动配...

3479
来自专栏java一日一条

Java Web系列:Spring依赖注入基础

Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构、基础设施和常用功能性组件,而是可以专注业务逻辑...

811
来自专栏Java 源码分析

SpringBoot 笔记(十一):Servlet容器

2865
来自专栏Java成神之路

Spring_总结_02_依赖注入

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

814

扫码关注云+社区

领取腾讯云代金券