`
mars5337
  • 浏览: 89354 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

androidjunit test基本知识(一)

阅读更多
Testing和Instrumentation        Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个方面进行更为复杂的测试,包括单元层面及框架层面。
Android测试环境的主要特征有:
l
可以访问Android系统对象。
l
Instrumentation框架可以控制和测试应用程序。
l
Android系统常用对象的模拟版本。
l
运行单个test或test suite的工具,带或不带Instrumentation。
l
支持以Eclipse的ADT插件和命令行方式管理Test和Test工程。
这篇文章是对Android测试环境和测试方法的简要介绍,并假设你已经拥有一定的Android应用程序编程及JUnit测试的经验。
概要
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框架,允许测试用例访问程序的状态及运行时对象。
下面的章节描述了Android中可利用的主要测试API。
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:
l
MoreAsserts类包含更多强大的断言方法,如assertContainsRegex(String, String),可以作正则表达式的匹配。
l
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中找到这些类。
它们是:
l
IsolatedContext——模拟一个Context,这样应用程序可以孤立运行。与此同时,还有大量的代码帮助我们完成与Context的通信。这个类在单元测试时很有用。
l
RenamingDelegatingContext——当修改默认的文件和数据库名时,可以委托大多数的函数到一个存在的、常规的Context上。使用这个类来测试文件和数据库与正常的系统Context之间的操作。
l
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上。
测试什么?
除了一些功能测试外,这里还有一些你应该考虑测试的内容:
l
Activity生命周期事件:你应该测试Activity处理生命周期事件的正确性。例如,一个Activity应该在pause或destroy事件时保存它的状态。记住一点的是屏幕方向的改变也会引发当前Activity销毁,因此,你需要测试这种偶然情况确保不会丢失应用程序状态。
l
数据库操作:你应该确保数据库操作能正确处理应用程序状态的变化。使用android.test.mock中的模拟对象。
l
屏幕大小和分辨率:在发布程序之前,确保在所有要运行的屏幕大小和分辨率上测试通过。你可以使用AVD来测试,或者使用真实的目标设备进行测试。
分享到:
评论

相关推荐

    android JUnit demo

    此外,可能还会涉及到`ActivityInstrumentationTestCase2` 或 `AndroidJUnit4` 测试类,它们是Android测试库提供的测试基类,提供了启动和控制`Activity`的能力,这对于测试与`Spinner`交互的`Activity`是必要的。...

    android-junit5,使用junit 5进行android测试。.zip

    下面是一个简单的AndroidJUnit5测试用例示例,测试一个计算加法的函数: ```java import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class ...

    0android_test[1]

    - 编写对应的测试类,通常位于`app/src/test/java`目录下,继承自`AndroidJUnit4`,并使用`@Test`注解标记测试方法。 - 在测试方法中,可能包括对Activity的启动、文本显示的断言等,确保"HelloWorld"字符串正确...

    android junit测试

    ### Android JUnit 测试知识点详解 #### 一、JUnit简介及在Android中的应用 JUnit是一种常用的Java编程语言单元测试框架,被广泛应用于软件开发过程中的测试驱动开发(TDD)模式。通过编写测试代码来验证应用程序...

    Android实战内容:TestApp

    在Android开发领域,TestApp是一个典型的实战项目名称,它涵盖了Android应用从设计到实现的各个环节。这个项目可能是为了教授开发者如何构建一个完整的Android应用程序,强调实践操作和测试的重要性。在这个项目中,...

    JUnit 4测试驱动开发----junit技术讲解

    在JUnit 4中,每个@Test注解的方法就是一个单元测试,每个测试方法应该独立于其他方法运行,避免了方法间的影响。 3. 更高级的JUnit 4特性 除了基本的断言和@Test注解外,JUnit 4还提供了许多高级特性,如: - `@...

    Test_Framework_training.pdf

    本文介绍了Android Test Framework的基础知识,包括其架构、如何定义测试用例以及如何编写和运行测试。通过这些基础知识的学习,开发者可以更好地利用Android Test Framework进行自动化测试,从而提高软件质量和开发...

    AdbTest官方资源例子

    在Android开发中,AdbTest是一个常见的工具,用于测试和调试设备。这个官方资源例子提供了丰富的学习材料,帮助开发者更深入地理解如何使用ADB(Android Debug Bridge)进行应用程序测试。ADB是Android SDK的一个重要...

    Android实战内容:TestApp2

    【Android实战内容:TestApp2】项目解析与学习...通过深入学习和实践TestApp2项目,开发者不仅能掌握Android开发的基础知识,还能了解到实际项目中可能出现的各种问题和解决方案,为自己的Android开发技能树添砖加瓦。

    安卓基础资料连载二

    - **单元测试(JUnitTest)**:测试单个功能模块,可能涉及多个方法的调用。 - **集成测试(IntegrationTest)**:测试不同模块之间的交互和集成。 - **冒烟测试**:快速、基本的功能验证,确保主要功能正常。 - **...

    Android test

    这里我们将深入探讨Android测试的基础知识、重要性以及常用的测试类型。 首先,理解测试的重要性是至关重要的。Android测试帮助开发者发现并修复代码中的错误,提高应用的可靠性,确保它能在不同设备和Android版本...

    Android Test.rar

    这份2011年的面试题集虽然年代久远,但其涵盖的测试基础知识和理念对于现代Android开发者来说依然具有指导意义。掌握并理解这些知识点,将有助于你在面试中展现出深厚的技术功底,同时也能提升实际项目中的测试效率...

    Test_dup2_x2.rar_android

    测试类可以通过`@RunWith(AndroidJUnit4.class)`注解来指定使用Android测试运行器,并且可以使用`@SmallTest`, `@MediumTest`, `@LargeTest`注解来标记测试的规模。 总的来说,`Test_dup2_x2.rar_android`这个...

    android_test:android_sdk_testing

    一、Android测试基础 1. 测试层次:Android测试分为单元测试(Unit Tests)、UI测试(UI Tests)、集成测试(Integration Tests)和端到端测试(End-to-End Tests)。单元测试主要针对单个组件或函数,而UI测试验证...

    android 单元测试

    2. 创建测试类:在`test`目录下创建一个新的Java类,继承自`androidx.test.ext.junit.runners.AndroidJUnit4`,并使用`@RunWith`注解标记。 ```java import androidx.test.ext.junit.runners.AndroidJUnit4; ...

    Android测试,日志

    本章节将详细介绍Android测试的基础知识,包括不同类型的测试以及如何利用JUnit进行单元测试。 #### 二、常见测试分类 在Android开发过程中,测试可以根据不同的标准进行分类: ##### 1. 根据是否知道源程序源码...

    Android基本的例子

    在Android开发领域,创建一个基本的应用程序涉及到多个关键知识点,这些知识点构成了Android应用程序的基础结构。在"Android基本的例子"这个项目中,我们看到的是一个简单的应用,它实现了订单下单和统计页面的功能...

    Android实战内容:TestApp1

    在Android开发领域,TestApp1是一个典型的实战项目名称,它可能涵盖了从应用设计到功能实现的全过程。在本文中,我们将深入探讨与Android Studio、Android操作系统以及APP开发相关的知识点。 首先,Android Studio...

    Android Studio中进行单元测

    除了基本的JUnit测试,Android Studio还支持 Espresso 和 Robolectric 这样的UI测试框架。Espresso用于进行界面交互测试,它能够模拟用户对UI的操作,验证UI状态。而Robolectric则是在没有真实设备或模拟器的情况下...

    第一行代码Android学习练习代码4

    7. **Fragment的测试**:测试Fragment通常包括对UI、生命周期方法、数据处理等方面,可以使用JUnit和AndroidX Test框架来进行单元测试和集成测试。 通过这个练习,你将能够深入理解Fragment的工作原理,提高你的...

Global site tag (gtag.js) - Google Analytics