AndroidTest学习(1)Android测试基础(部分搬运)

使用AndroidStudio创建工程的时候总会发现自动构建出一个同名的包后面括号标注(AndroidTest)或者(Test)
所以就上网查了一些关于AndroidTest的文章

原文地址:http://blog.chinaunix.net/uid-20771867-id-121133.html
AndroidStudio下使用AndroidTest的英文书籍:http://pan.baidu.com/s/1skbOBrn (本书的Chapter11)```

Testing和Instrumentation

Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试的框架,尽管你可以试用JUnit测试Android工程,但是Android工具允许你为应用程序的各方面进行更为复杂的测试,包括单元层面及框架层面.

Android测试环境的主要特征有:

  • 可以访问Android系统对象.
  • Instrumentation框架可以控制和测试应用程序.
  • Android系统常用对象的模拟版本.
  • 运行单个的Test或Test Suite的工具,带或不带Instrumentation

概要

Android测试环境的核心是一个Instrumentation框架,在这个框架下你的测试应用程序可以精确控制应用程序.试用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态,.Instrumentation框架将通过主程序和测试程序运行在同一个进程来实现这些功能.

通通在测试工程的Manifest文件中添加元素来指定要测试的应用程序.这个元素的特性指明了要测试的应用程序包名,以及高速Android程序该如何运行测试程序,在InstrumentationTestRunner章节有更多的细节描述.

在Android中,测试程序也是Android程序,,因此它和被测试程序的书写方式,有很多相同的地方,SDK工具能帮助你同事创建主程序及它的测试工程,

TestingAPI

Android提供了基于JUnit测试框架的测试API来书写测试用例和测试程序.另外Android海提供强大的Instrumentation框架,允许测试用例访问程序的状态及运行时的对象.
下面的章节描述了Android测试中可利用的主要测试API.

JUnit TestCase类

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

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

InstrumentationTestCase类

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

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

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

Assert类

Android还继承了JUnit的Assert类,其中有两个子类:MoreAssertsViewAsserts:

  • MoreAsserts类包含更多强大的断言方法,如assertContainsRegex(String string),可以作正则表达式的匹配
  • ViewAsserts类包含关于AndroidView的有用断言方法,如asserHasScreenCoordinates(View view,int ,int),,可以测试View在可视区域的特定X,Y的位置,这些Assert简化了UI中几何图形和对其方式的测试,

Mock对象类

Android有一些类可以方便的创建模拟的系统对象,如Application,Context,ContentProvider和Resource,Android还在一些测试类中提供了一些方法来创建模拟的Intent,因为这些模拟器的对象比实际对象更容易使用,因此,试用它们能简化依赖注入,你可以在android.testandroid.test.mock中找到这些类
它们是

  • IsolateContext:模拟一个Context,这样应用程序可以孤立运行,与此同时,还有大量的代码帮助我们完成与Context的通信,这个类在单元测试时很有用,
  • RenamingDelegatingContext:当修改默认文件和数据库名时,可以委托大多数的函数到一个存在的,常规的Context上,试用这个类来测试文件和数据库与正常系统Context之间的操作
  • MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources:创建模拟的系统对象的类,它们只暴露那些对对象的管理有用的方法,这些方法的默认实现只是抛出异常,你需要继承这些类,并重写这些方法.

InstrumentationTestRunner

Android提供了自定义的运行测试用例的类,叫做InstrumentationTestRunner.这个类控制应用程序处于测试环境中,在同一个进程中运行测试程序和主程序,,并将测试结果输出到合适的地方,InstrumentationTestRunner在运行是对整个运行环境的控制能力的关键是试用Instrumentation,注意,如果你的测试类不使用Instrumentation的话,你也可以用这个TestRunner,
当你运行一个测试程序时,首先会运行一个系统工具叫做ActivityManager,ActivityManager使用Instrumentation框架,来启动和控制TestRunner,这个TestRunner反过来又使用Instrumentation来关闭任何主程序的实例,然后启动测试程序和主程序(在同一个进程中,),这样能确保测试程序和主程序的直接交互,

在测试环境中工作

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

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

测试工程

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

测试用例

一个测试程序包含一个或多个测试用例,它们都继承自AndroidTestCase类,选择一个测试用例取决于你要测试的Android组件的类型以及你要作什么样的测试,一个测试程序可以测试不同的组件,但每个测试用例类类设计时只能测试单一类型的组件,

一些Android组件有多个关联的测试用例类,在这种情况下可以选择,类间,你需要判你要进行的测试类型,例如对于Activity来说,你有两个选择,ActivityInstrumentationTestCase2,和ActivityUnitTestCase,

AndroidInstrumentationTestCase2设计用于设计一些功能性的测试,因此它在一个正常的系统环境中测试Activity,你可以注入Intent,但不能是模拟的Context,一般来说你不能模拟Activity之间的以来关系,

相比而言,ActivityUnitTestCase设计用于单元测试,因此它在一个孤立的系统环境中测试Activity,换句话说,当你用这个测试类时,Activity不能与其他的Activity交互,
作为一个经验法则,如果想测试Activity与Android之间的交互的话,使用AndroidInstrumentationTestCase2,如果想对一个Activity作回归测试的话,使用AndroidUnitTestCase,

测试方法

每个测试用例提供了可以建立测试环境和控制应用程序的方法,例如所有的测试用例类都提供了JUnit的setUp()方法,来搭建测试环境,另外,你可以添加方法来定义单独的测试,,当你运行测试程序时,每个添加的方法都运行一次,如果你重写了setUp方法,它会在每个方法运行前运行,相似的tearDown()方法会在每个方法运行后运行,

测试用例提供了大量的对组件启动和停止控制的方法,由于这个原因,在运行测试之前,你需要明确告诉Android启动一个组件,例如你可以用getActivity()来启动一个Activity,在整个测试用例期间,你只能调用这个方法一次,或者每个测试方法一次,甚至你可以在单个的测试方法中,用它的finishing()来销毁Activity,然后再调用getActivity()重新启动一个,

运行测试并查看结果

编译完测试工程后,你就可以使用系统工具Activity Manager来运行测试程序。你给Activity Manager提供了TestRunner的名(一般是InstrumentationTestRunner,在程序中指定);名包括被测试程序的包名TestRunner的名。Activity Manager加载并启动你的测试程序,杀死主程序的任何实例,然后在测试程序的同一个进程里加载主程序,然后传递测试程序的第一个测试用例。这个时候,TestRunner会接管这些测试用例,运行里面的每个测试方法,直到所有的方法运行结束

测试什么

你可能感兴趣的:(AndroidTest学习(1)Android测试基础(部分搬运))