`
dowhathowtodo
  • 浏览: 805650 次
文章分类
社区版块
存档分类
最新评论

android基础知识12:android自动化测试06—Instrumentation 03 技术概要

 
阅读更多
Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个方面进行更为复杂的测试,包括单元层面及框架层面。
Android测试环境的主要特征有:
l可以访问Android系统对象。
lInstrumentation框架可以控制和测试应用程序。
lAndroid系统常用对象的模拟版本。
l运行单个testtest suite的工具,带或不带Instrumentation
l支持以EclipseADT插件和命令行方式管理TestTest工程。

概要
Android测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。
通过在测试工程的manifest文件中添加<instrumentation>元素来指定要测试的应用程序。这个元素的特性指明了要测试的应用程序包名,以及告诉Android如何运行测试程序。在Inustrumentation TestRunner章节有更多的细节描述。

下面的图片概要的描述了Android的测试环境:


在Android中,测试程序也是Android程序,因此,它和被测试程序的书写方式有很多相同的地方。SDK工具能帮助你同时创建主程序工程及它的测试工程。你可以通过Eclipse的ADT插件或者命令行来运行Android测试。Eclipse的ADT提供了大量的工具来创建测试用例,运行以及查看结果。

Testing API
Android提供了基于JUnit测试框架的测试API来书写测试用例和测试程序。另外,Android还提供了强大的Instrumentation框架,允许测试用例访问程序的状态及运行时对象。

JUnit TestCase类
继承自JUnit的TestCase,不能使用Instrumentation框架。但这些类包含访问系统对象(如Context)的方法。使用Context,你可以浏览资源,文件,数据库等等。基类是AndroidTestCase,一般常见的是它的子类,和特定组件关联。

子类有:
l ApplicationTestCase——测试整个应用程序的类。它允许你注入一个模拟的Context到应用程序中,在应用程序启动之前初始化测试参数,并在应用程序结束之后销毁之前检查应用程序。
l ProviderTestCase2——测试单个ContentProvider的类。因为它要求使用MockContentResolver,并注入一个IsolatedContext,因此Provider的测试是与OS孤立的。
l ServiceTestCase——测试单个Service的类。你可以注入一个模拟的Context或模拟的Application(或者两者),或者让Android为你提供Context和MockApplication。

Instrumentation TestCase类
继承自JUnit TestCase类,并可以使用Instrumentation框架,用于测试Activity。使用Instrumentation,Android可以向程序发送事件来自动进行UI测试,并可以精确控制Activity的启动,监测Activity生命周期的状态。
基类是InstrumentationTestCase。它的所有子类都能发送按键或触摸事件给UI。子类还可以注入一个模拟的Intent。
子类有:
l ActivityTestCase——Activity测试类的基类。
l SingleLaunchActivityTestCase——测试单个Activity的类。它能触发一次setup()和tearDown(),而不是每个方法调用时都触发。如果你的测试方法都是针对同一个Activity的话,那就使用它吧。
l SyncBaseInstrumentation——测试Content Provider同步性的类。它使用Instrumentation在启动测试同步性之前取消已经存在的同步对象。
l ActivityUnitTestCase——对单个Activity进行单一测试的类。使用它,你可以注入模拟的Context或Application,或者两者。它用于对Activity进行单元测试。
不同于其它的Instrumentation类,这个测试类不能注入模拟的Intent。
l ActivityInstrumentationTestCase2——在正常的系统环境中测试单个Activity的类。你不能注入一个模拟的Context,但你可以注入一个模拟的Intent。另外,你还可以在UI线程(应用程序的主线程)运行测试方法,并且可以给应用程序UI发送按键及触摸事件。
Assert类
Android还继承了JUnit的Assert类,其中,有两个子类,MoreAsserts和ViewAsserts:
MoreAsserts类包含更多强大的断言方法,如assertContainsRegex(String, String),可以作正则表达式的匹配。
ViewAsserts类包含关于Android View的有用断言方法,如assertHasScreenCoordinates(View, View, int, int),可以测试View在可视区域的特定X、Y位置。这些Assert简化了UI中几何图形和对齐方式的测试。

Mock对象类
Android有一些类可以方便的创建模拟的系统对象,如Application,Context,Content Resolver和Resource。Android还在一些测试类中提供了一些方法来创建模拟的Intent。因为这些模拟的对象比实际对象更容易使用,因此,使用它们能简化依赖注入。你可以在android.test和android.test.mock中找到这些类。
它们是:
IsolatedContext——模拟一个Context,这样应用程序可以孤立运行。与此同时,还有大量的代码帮助我们完成与Context的通信。这个类在单元测试时很有用。
RenamingDelegatingContext——当修改默认的文件和数据库名时,可以委托大多数的函数到一个存在的、常规的Context上。使用这个类来测试文件和数据库与正常的系统Context之间的操作。
MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources——创建模拟的系统对象的类。它们只暴露那些对对象的管理有用的方法。这些方法的默认实现只是抛出异常。你需要继承这些类并重写这些方法。

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

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

在测试环境中工作
对Android程序的测试都包含在一个测试程序里,它本身也是一个Android应用程序。测试程序以单独的Android工程存在,与正常的Android程序有着相同的文件和文件夹。测试工程通过在manifest文件中指定要测试的应用程序。

每个测试程序包含一个或多个针对特定类型组件的测试用例。测试用例里定义了测试应用程序某些部分的测试方法。当你运行测试程序,Android会在相同进程里加载主程序,然后触发每个测试用例里的测试方法。

测试工程
为了开始对一个Android程序测试,你需要使用Android工具创建一个测试工程。工具会创建工程文件夹、文件和所需的子文件夹。工具还会创建一个manifest文件,指定被测试的应用程序。

测试用例
一个测试程序包含一个或多个测试用例,它们都继承自Android TestCase类。选择一个测试用例类取决于你要测试的Android组件的类型以及你要做什么样的测试。一个测试程序可以测试不同的组件,但每个测试用例类设计时只能测试单一类型的组件。
一些Android组件有多个关联的测试用例类。在这种情况下,在可选择的类间,你需要判断你要进行的测试类型。例如,对于Activity来说,你有两个选择,ActivityInstrumentationTestCase2和ActivityUnitTestCase。
ActivityInstrumentationTestCase2设计用于进行一些功能性的测试,因此,它在一个正常的系统环境中测试Activity。你可以注入模拟的Intent,但不能是模拟的Context。一般来说,你不能模拟Activity间的依赖关系。
相比而言,ActivityUnitTestCase设计用于单元测试,因此,它在一个孤立的系统环境中测试Activity。换句话说,当你使用这个测试类时,Activity不能与其它Activity交互。
作为一个经验法则,如果你想测试Activity与Android的交互的话,使用ActivityInstrumentationTestCase2。如果你想对一个Activity做回归测试的话,使用ActivityUnitTestCase。

测试方法
每个测试用例类提供了可以建立测试环境和控制应用程序的方法。例如,所有的测试用例类都提供了JUnit的setUp()方法来搭建测试环境。另外,你可以添加方法来定义单独的测试。当你运行测试程序时,每个添加的方法都会运行一次。如果你重写了setUp()方法,它会在每个方法运行前运行。相似的,tearDown()方法会在每个方法之后运行。
测试用例类提供了大量的对组件启动和停止控制的方法。由于这个原因,在运行测试之前,你需要明确告诉Android启动一个组件。例如,你可以使用getActivity()来启动一个Activity。在整个测试用例期间,你只能调用这个方法一次,或者每个测试方法一次。甚至你可以在单个测试方法中,调用它的finishing()来销毁Activity,然后再调用getActivity()重新启动一个。
运行测试并查看结果
编译完测试工程后,你就可以使用系统工具Activity Manager来运行测试程序。你给Activity Manager提供了TestRunner的名(一般是InstrumentationTestRunner,在程序中指定);名包括被测试程序的包名和
TestRunner的名。Activity Manager加载并启动你的测试程序,杀死主程序的任何实例,然后在测试程序的同一个进程里加载主程序,然后传递测试程序的第一个测试用例。这个时候,TestRunner会接管这些测试用
例,运行里面的每个测试方法,直到所有的方法运行结束。
如果你使用Eclipse,结果会在JUnit的面板中显示。如果你使用命令行,将输出到STDOUT上。

测试什么?

除了一些功能测试外,这里还有一些你应该考虑测试的内容:
Activity生命周期事件:你应该测试Activity处理生命周期事件的正确性。例如,一个Activity应该在
pause或destroy事件时保存它的状态。记住一点的是屏幕方向的改变也会引发当前Activity销毁,因此,你
需要测试这种偶然情况确保不会丢失应用程序状态。
数据库操作:你应该确保数据库操作能正确处理应用程序状态的变化。使用android.test.mock中的模
拟对象。
屏幕大小和分辨率:在发布程序之前,确保在所有要运行的屏幕大小和分辨率上测试通过。你可以使用
AVD来测试,或者使用真实的目标设备进行测试。

附加:UI测试
接下来的章节为应用程序UI的测试提供了一些提示,特别是帮助你在UI线程里处理动作,触屏和按键事件,
和锁屏。

UI线程中测试
Activity运行在程序的UI线程里。一旦UI初始化后,例如在Activity的onCreate()方法后,所有与UI的交互都必须运行在UI线程里。当你正常运行程序时,它有权限可以访问这个线程,并且不会出现什么特别的事情。
当你运行测试程序时,这一点发生了变化。在带有instrumentation的类里,你可以触发方法在UI线程里运
行。其它的测试用例类不允许这么做。为了一个完整的测试方法都在UI线程里运行,你可以使用
@UIThreadTest来声明线程。注意,这将会在UI线程里运行方法里所有的语句。不与UI交互的方法不允许这么做;例如,你不能触发Instrumentation.waitForIdleSync()。
如果让方法中的一部分代码运行在UI线程的话,创建一个匿名的Runnable对象,把代码放到run()方法中,
然后把这个对象传递给appActivity.runOnUiThread(),在这里,appActivity就是你要测试的app对象。
例如,下面的代码实例化了一个要测试的Activity,为Spinner请求焦点,然后发送一个按键给它。注意:
waitForIdleSync和sendKeys不允许在UI线程里运行:

Java代码:
private MyActivity mActivity; 

private Spinner mSpinner; 
... 
protected void setUp() throws Exception { 
super.setUp(); 
mInstrumentation = getInstrumentation(); 
mActivity = getActivity(); 

mSpinner = (Spinner) mActivity.findViewById(com.android.demo.myactivity.R.id.Spinner01); 

public void aTest() { 
mActivity.runOnUiThread(new Runnable() { 

public void run() { 
mSpinner.requestFocus(); 
} 

}); 

mInstrumentation.waitForIdleSync(); 
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
关闭触屏模式
为了控制从测试程序中发送给模拟器或设备的按键事件,你必须关闭触屏模式。如果你不这么做,按键事件将被忽略。
关闭触摸模式,你需要在调用getActivity()启动Activity之前调用ActivityInstrumentationTestCase2.setActivityTouchMode(false)。你必须在非UI线程中运行这个调用。基于这个原因,你不能在声明有@UIThread的测试方法调用。可以在setUp()中调用。

模拟器或设备的解锁
你可能已经发现,如果模拟器或设备的键盘保护模式使得HOME画面不可用时,UI测试不能正常工作。这是因为应用程序不能接收sendKeys()的事件。避免这种情况最好的方式是在启动模拟器或设备时关闭键盘保护模式。
你还可以显式地关闭键盘保护。这需要在manifest文件中添加一个权限,然后就能在程序中关闭键盘保护。注意,你必须在发布程序之前移除这个,或者在发布的程序中禁用这个功能。
在<manifest>元素下添加<uses-permission android:name=”androd.permission.DISABLE_KEYGUARD”/>。为了关闭键盘保护,在你测试的Activity的onCreate()方法中添加以下代码:

Java代码:
mKeyGuardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); 
mLock = mKeyGuardManager.newKeyguardLock("activity_classname"); 
mLock.disableKeyguard();

参考文档:
分享到:
评论

相关推荐

    Android单元测试初探——Instrumentation

    学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次。这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以先写个基本入门吧!...

    测试自动化实践 淘宝Android UI自动化测试的探索 共23页.pptx

    TMTS的核心是基于Android的Instrumentation机制,能够支持发布版本的测试,同时也提供了对内嵌WebView的自动化支持。 在原始设计需求方面,TMTS致力于解决以下问题: 1. **无需专门为自动化测试打包**:TMTS旨在对...

    Android 自动化测试框架

    Instrumentation是Google早期提供的Android自动化测试基础工具,它提供了一种低级别的接口来控制和监控应用的行为。虽然可以用来编写测试,但它较为底层,通常需要结合其他框架如JUnit或Robotium来实现更高级别的...

    基于Android的自动化测试的设计与实现【PDF】

    本文将深入分析Android自动化测试框架及其层次关系,并探讨基于JUnit和instrumentation的Android自动化测试框架实现技术,同时还将涉及集成Hudson进行自动化测试的方法。 首先,Android是一个完全开放的手机平台,...

    深入理解Android自动化测试学习下载

    3. **Instrumentation测试**:Android的Instrumentation测试框架允许对应用的完整生命周期进行控制,包括启动、暂停、恢复和销毁等操作,通常用于集成测试。 4. **Mockito与Android Mock**:Mockito是一个流行的...

    Android自动化测试

    本文将深入探讨“Android自动化测试”这一主题,特别是与`robotium`框架相关的知识,并介绍两个关联的库文件:`android-junit-report-1.5.8.jar`和`android-junit-report-1.2.6.jar`。 首先,让我们了解什么是...

    Android自动化测试之Robotium--基础操作

    根据提供的文件信息,接下来详细阐述Android自动化测试工具Robotium的基本知识点。 首先,Robotium是一个开源的自动化测试框架,专门用于Android平台的应用程序。它弥补了ActivityInstrumentationTestCase2在集成...

    基于Android的自动化测试的设计与实现

    随着移动设备的快速发展,尤其是Android系统的广泛应用,自动化测试成为了提高产品质量和缩短测试周期的关键技术。Android自动化测试旨在减少手动测试的繁琐和错误,提高测试覆盖率,确保应用在各种环境下的稳定性和...

    Android UI自动化测试的探索

    ### Android UI自动化测试的核心概念与实践 #### 一、Android UI自动化测试概述 在移动互联网时代,Android作为全球最大的移动操作系统之一,其应用程序的数量和复杂度也在不断增加。为了确保应用程序的质量,UI...

    手机自动化测试原理

    手机自动化测试原理主要涉及到PC控制端、手机终端的agent、通信接口以及自动化测试框架的构建。测试过程中,PC上的控制端通常使用特定的测试工具,如Appium、Selendroid等,通过串口、USB或无线连接(如Wi-Fi、蓝牙...

    Android自动化测试之Robotium--进阶操作.pdf

    通过以上这些知识点,我们可以了解到Robotium框架在Android自动化测试中的强大功能以及如何通过搭建测试环境、解析Android UI和利用Robotium-solo API来实现更加深入的自动化测试。掌握这些知识,对于提升Android...

    android-support-multidex-instrumentation.jar.zip

    "android-support-multidex-instrumentation.jar.zip" 是一个包含 Android Support Library 多 dex 支持中的 instrumentation 组件的压缩包文件。 首先,我们来理解一下“multidex”。在Android 5.0(API级别21)...

    关于Android 下的自动化测试

    在Android开发领域,自动化测试是不可或缺的一环,尤其在Java环境下进行敏捷开发时,测试驱动开发(TDD)显得尤为重要。本文主要概述了Android平台下的几种自动化测试手段,旨在提供一个全面的比较,而不是深入探讨每...

    Appium自动化测试工具介绍

    ### Appium自动化测试工具知识点详解 #### 一、Appium简介及原理 ##### 1.1 Appium简介 - **定义**: Appium是一款强大的开源自动化测试工具,支持iOS和Android两大移动操作系统,能够进行跨平台的测试工作。适用...

    Android UiAutomator 自动化测试

    Android UIAutomator自动化测试是一种强大的工具,用于在Android平台上进行UI层面的自动化测试。它主要适用于Android 4.1及更高版本,但不支持Hybrid App和WebApp的测试。UIAutomator是基于Java的,这使得测试代码...

    appium做移动端自动化测试

    在开始介绍Appium之前,我们先简要了解一下Android和iOS平台官方提供的自动化测试工具。 **Android平台官方自动化测试工具:** - **单元测试**:AndroidJUnitRunner,这是一种基于JUnit的单元测试框架。 - **稳定...

    行业分类-设备装置-基于android平台的自动化测试方法及测试工具.zip

    本压缩包“行业分类-设备装置-基于android平台的自动化测试方法及测试工具.zip”提供了关于如何在Android平台上进行自动化测试的方法和工具的详细资料,特别是针对设备装置的测试。 首先,我们来了解一下自动化测试...

    Android应用的多设备自动化测试实现.pdf

    1. **单元测试**:Android平台整合了JUnit测试框架和Instrumentation机制,支持针对单一应用的单元测试。开发者可以编写测试用例,确保代码模块的正确性。 2. **集成测试**:Robotium是一个流行的自动化集成测试...

    Android自动化测试可行性途径分析.pdf

    **CTS技术基础**:CTS测试基于Android Instrumentation框架构建,这是一个用于编写和执行自动化测试的强大工具。更进一步地说,CTS测试是基于JUnit框架编写的单元测试用例集合。这意味着CTS本质上是一系列单元测试...

Global site tag (gtag.js) - Google Analytics