Android测试初探(二) 单元测试实例:基于Instrumentation Test Runner的JUnit3测试

JUnit Test

这里我们设置Test Artifact为Android Instrumentation Test,进行JUnit Test,测试代码会通过Android Test Runner在Android设备上运行。

过程分四步:

  1. 编写待测试程序
  2. 编写测试代码
  3. 配置运行参数
  4. 运行测试并查看结果

编写待测试程序

在App中创建一个待测试类Cal

  1. public class Cal {

  2. public int add(int a, int b) {

  3. return a + b;

  4. }

  5. public int multiply(int a, int b) {

  6. return a * b;

  7. }

  8. }

编写测试代码

之后的几个步骤,既可以用Android Studio自动执行,也可以手动实现。文章会先后介绍两种方式,建议用自动方式,既节省时间,也不用担心因为Android Studio版本不同等原因,导致的配置出错。

右击一个类或者方法,Go To,Test,Create New Test…


我当前使用的Android环境默认支持JUnit3,因此默认选中的Testing library为JUnit3,不需修改。JUnit4需要额外配置环境,配置将在之后的文章中介绍。

勾选setUp/@Before和要测试的方法,点击OK。setUp用于进行初始化操作,tearDown则可以进行清理、释放资源等操作。

如果弹窗要求选择目标文件夹,选择src/androidTest/java目录下同名的包(如果没有这个文件夹,需要提前手动创建)。

基于JUnit3的测试类CalTest自动生成,代码如下:

  1. public class CalTest extends TestCase {

  2. public void setUp() throws Exception {

  3. super.setUp();

  4. }

  5. public void testAdd() throws Exception {

  6. }

  7. public void testMultiply() throws Exception {

  8. }

  9. }

如果是JUnit4,会使用Annotation,代码格式略有不同:

  1. @Before

  2. public void setUp() throws Exception {

  3. }

  4. @Test

  5. public void testAdd() throws Exception {

  6. }

  7. @Test

  8. public void testMultiply() throws Exception {

  9. }

编写testCase

在setUp方法中,进行一些测试初始化操作,这里实例化一个Cal对象。在每个test方法中,进行一个testCase测试;执行结束则测试通过,抛出异常则测试失败。可以通过断言实现testCase,测试类代码如下。

测试类和待测试类虽然在不同文件夹下,但实际上处于同一个包中,因此测试类可以访问待测试类的protected和默认权限的方法。

  1. public class CalTest extends TestCase {

  2. private Cal mCal;

  3. public void setUp() throws Exception {

  4. super.setUp();

  5. mCal = new Cal();

  6. }

  7. public void testAdd() throws Exception {

  8. assertEquals(mCal.add(1, 2), 3);

  9. }

  10. public void testMultiply() throws Exception {

  11. assertEquals(mCal.multiply(2, 3), 6);

  12. }

  13. }

配置运行参数并运行测试

第一次运行测试类时,需要配置Run Configuration。最简单的方法是直接右击测试类,Run,弹出三个不同图标的选项,分别表示正常的App、AndroidTest和JUnitTest。因为Test Artifact选的是Android Instrumentation Test,因此这里选AndroidTest。

上面这个操作直接执行了两步操作:配置运行参数,运行测试。

从上方工具栏可以看到,多了一个运行参数CalTest。

同时测试代码会被执行。因为这里的Cal编写正确,testCase能通过测试,所以下方的Run和EventLog窗口会提示测试完成和测试通过的信息。这个过程中,可能会弹出选择Android设备的窗口,同时可以看到Run窗口中有Uploading file、Installing等信息,说明测试代码确实被编译成了APK文件(Test Runner),在Android设备上运行的。

测试失败的情况

将testCase中的testMultiply测试方法改成

  1. public void testMultiply() throws Exception {
  2. assertEquals(mCal.multiply(2, 3), 5);
  3. }

因为已经配置了运行参数,这次直接点击上方工具栏的三角形按钮即可运行。

运行的结果如下。Run窗口中提示Done:2 of 2 Failed:1,并且Exception信息中指出expected:<6> but was:<5>,EventLog窗口提示测试失败。

手动创建测试类

前面直接用Android Studio的Go To菜单自动创建了测试类,也可以手动完成。

手动创建,只需在app模块下src/androidTest/java下的任意位置新建测试类并继承TestCase,对于JUnit3测试方法只要命名以test为前缀,且为public类型即可(JUnit4则用注解标明)。

建议命名为CalTest并放在和Cal对应的包中,测试方法名称和被测试方法对应。

手动配置运行参数

前面用的自动配置运行参数,也可以手动配置参数。选择Edit Configurations…

点击左上角的加号,选择Android Tests

  • 可以给运行参数设置一个名字,例如CalTest
  • Module选择app
  • Test:选择Class并在Class中选择要执行的测试类,就会执行这个类的每个测试方法。也可以选择Method、All in Package、All in Module运行一个方法,或是一次性运行包、模块中所有类的测试方法。
  • Target Device:选择Show chooser dialog,则运行测试时可以手动选择GenyMotion模拟器或者真机;如果选Emulator,则直接使用Android SDK自带模拟器。

设置完成点击OK即可。

Instrumentation Test Runner

前面提到Test Runner的APK被编译安装到Android设备中,运行完测试后,可以在测试设备上找到。

我所使用的环境下,Android默认使用的是Instrumentation Test Runner,这个Runner默认支持JUnit3。利用adb shell执行pm指令:

  1. adb shell pm list instrumentation

可以看到设备上安装的Test Runner

  1. instrumentation:com.example.android.apis/.app.LocalSampleInstrumentation (target=com.example.android.apis)
  2. instrumentation:com.jzj1993.unittest.test/android.test.InstrumentationTestRunner (target=com.jzj1993.unittest)

Test Runner中没有Activity界面,因此也不会在启动器上建立快捷方式。但是在设置中的所有应用里,可以看到这个APP,如图。