android 单元测试方法 类继承 Instrumentation

实际上,TestCase这个类用于在Android担当所有独特的TestCase的基类的作用,它是一个Abstract Class。Android单元测试类继承关系图如下所示:

android 单元测试方法 类继承 Instrumentation_第1张图片

  之所以有那么多XXXTestCase主要是为了简化工作。例如当你想对一个访问数据库的功能进行测试时,首先需要自己启动并初始化数据库。在 这里是类似的,如果你想测试一个Activity,首先要启动它。而ActivityTestCase就会自动帮你做完这些事情。而 ActivityUnitTestCase会更注重测试的独立性,它会让测试与Android底层的联系降到最低。其余的类可以查看相关的Javadoc 来按需挑选。要编写测试,就是找到合适的XXXTestCase作为基类来继承,并且编写自己的测试方法。

  很明显的,最简单的编写测试的方法就是继承AndroidTestCase写一个自己的TestCase。然后为自己的一组TestCase写 一个Activity界面,由界面控制TestCase的启动,运行和结果报告。但是,你很快会发现,为何要给测试写一个界面呢?这太诡异了。这时就需要 一种技术,它可以利用命令行(Shell)来启动一组测试,并且通过命令行的形式给出结果。这就是所谓的Instrumentation。

  什么是Instrumentation?

  一般在开发Android程序的时候,需要写一个manifest文件,其结构是:

<application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".TestApp" android:label="@string/app_name">
  ……
  </activity>
</application>

  这样,在启动程序的时候就会先启动一个Application,然后在此Application运行过程中根据情况加载相应的 Activity,而Activity是需要一个界面的。但是Instrumentation并不是这样的。你可以将Instrumentation理解 为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。任何想成为Instrumentation的类必须继承android.app.Instrumentation。下面是 这个类的解释:

  Base class for implementing application instrumentation code. When running with instrumentation turned on, this class will be instantiated for you before any of the application code, allowing you to monitor all of the interaction the system has with the application. An Instrumentation implementation is described to the system through an AndroidManifest.xml's <instrumentation> tag.

  对于单元测试,我们需要认真了解的就是android.test.InstrumentationTestRunner类。这是Android单元测试的主入口。它相当于JUnit当中TestRunner的作用。

  那么如何加载它呢,首先要在manifest文件中加入一行关于Instrumentation的声明。比如Android Api Demos中的测试里的manifest是这么写的(我滤掉了所有的注释):

<manifest xmlns:android=" http://schemas.android.com/apk/res/android"
package="com.example.android.apis.tests">
  <application>
  <uses-library android:name="android.test.runner" />
  </application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.android.apis"
android:label="Tests for Api Demos."/>
</manifest>下面将具体介绍如何将根据需要加载一组单元测试。  如何在Android中利用Instrumentation来进行测试?  在介绍具体的命令之前,我们先理解一下单元测试的层次。一组单元测试可以被组织成若干个TestSuite。每个TestSuite包含若干 TestCase(某个继承android.jar的junit.framework.TestCase的类)。每个TestCase又包含若干个 Test(具体的test方法)。 如果假设com.android.foo是你的测试代码的包的根。当执行以下命令时,会执行所有的TestCase的所有Test。测试的对象就是在Target Package中指定的包中的代码: 代码
adb shell am instrument -w com.android.foo/android.test.InstrumentationTestRunner  
adb shell am instrument -w com.android.foo/android.test.InstrumentationTestRunner 

如果你想 运行一个TestSuite ,首先继承android.jar的junit.framework.TestSuite类,实现一个TestSuite(比如叫com.android.foo.MyTestSuite),然后执行以下命令执行此TestSuite 代码
adb shell am instrument -e  class  com.android.foo.MyTestSuite -w com.android.foo/android.test.InstrumentationTestRunner  
adb shell am instrument -e class com.android.foo.MyTestSuite -w com.android.foo/android.test.InstrumentationTestRunner 
其中的-e表示额外的参数,语法为-e [arg1] [value1] [arg2] [value2] …这里用到了class参数。 如果仅仅想 运行一个TestCase (比如叫com.android.foo.MyTestCase),则用以下命令: 代码
adb shell am instrument -e  class  com.android.foo.MyTestCase -w com.android.foo/android.test.InstrumentationTestRunner  
adb shell am instrument -e class com.android.foo.MyTestCase -w com.android.foo/android.test.InstrumentationTestRunner 

如果仅仅想 运行一个Test (比如就是上面MyTestCase的testFoo方法),很类似的,就这样写: 代码
adb shell am instrument -e  class  com.android.foo.MyTestCase#testFoo -w com.android.foo/android.test.InstrumentationTestRunner  
adb shell am instrument -e class com.android.foo.MyTestCase#testFoo -w com.android.foo/android.test.InstrumentationTestRunner 

然后,所有的测试结果会输出到控制台,并会做一系列统计,如标记为E的是Error,标记为F的是Failure,Success的测试则会标记为一个 点。这和JUnit的语义一致。如果希望断点调试你的测试,只需要直接在代码上加上断点,然后将运行命令参数的-e后边附加上debug true后运行即可。更加详细的内容可以看InstrumentationTestRunner的Javadoc。测试方法也有以下几种,下面介绍两个常用的方法:

(1) 用Eclipse集成的JUnit工具
在Eclipse中选择工程Sample,单击右键,在Run as子菜单选项中选择Android JUnit Test

同时可以通过LogCat工具查看信息

android 单元测试方法 类继承 Instrumentation_第2张图片

(2) 通过模拟器运行单元测试

点击模拟器界面的Dev Tools菜单

再点击Instrumentation选项,进入Instrumentation菜单

android 单元测试方法 类继承 Instrumentation_第3张图片

这里有一个InstrumentationTestRunner,它是测试的入口,点击这个选项,就可以自动运行我们的测试代码。以下为运行结果:

按钮点击前

按钮点击后

你可能感兴趣的:(Instrumentation)