JUnit Test
这里我们设置Test Artifact为Android Instrumentation Test,进行JUnit Test,测试代码会通过Android Test Runner在Android设备上运行。
过程分四步:
- 编写待测试程序
- 编写测试代码
- 配置运行参数
- 运行测试并查看结果
编写待测试程序
在App中创建一个待测试类Cal
-
public class Cal {
-
public int add(int a, int b) {
-
return a + b;
-
}
-
public int multiply(int a, int b) {
-
return a * b;
-
}
-
}
编写测试代码
之后的几个步骤,既可以用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自动生成,代码如下:
-
public class CalTest extends TestCase {
-
public void setUp() throws Exception {
-
super.setUp();
-
}
-
public void testAdd() throws Exception {
-
}
-
public void testMultiply() throws Exception {
-
}
-
}
如果是JUnit4,会使用Annotation,代码格式略有不同:
-
@Before
-
public void setUp() throws Exception {
-
}
-
@Test
-
public void testAdd() throws Exception {
-
}
-
@Test
-
public void testMultiply() throws Exception {
-
}
编写testCase
在setUp方法中,进行一些测试初始化操作,这里实例化一个Cal对象。在每个test方法中,进行一个testCase测试;执行结束则测试通过,抛出异常则测试失败。可以通过断言实现testCase,测试类代码如下。
测试类和待测试类虽然在不同文件夹下,但实际上处于同一个包中,因此测试类可以访问待测试类的protected和默认权限的方法。
-
public class CalTest extends TestCase {
-
private Cal mCal;
-
public void setUp() throws Exception {
-
super.setUp();
-
mCal = new Cal();
-
}
-
public void testAdd() throws Exception {
-
assertEquals(mCal.add(1, 2), 3);
-
}
-
public void testMultiply() throws Exception {
-
assertEquals(mCal.multiply(2, 3), 6);
-
}
-
}
配置运行参数并运行测试
第一次运行测试类时,需要配置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测试方法改成
public void testMultiply() throws Exception {
assertEquals(mCal.multiply(2, 3), 5);
}
因为已经配置了运行参数,这次直接点击上方工具栏的三角形按钮即可运行。
运行的结果如下。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指令:
adb shell pm list instrumentation
可以看到设备上安装的Test Runner
instrumentation:com.example.android.apis/.app.LocalSampleInstrumentation (target=com.example.android.apis)
instrumentation:com.jzj1993.unittest.test/android.test.InstrumentationTestRunner (target=com.jzj1993.unittest)
Test Runner中没有Activity界面,因此也不会在启动器上建立快捷方式。但是在设置中的所有应用里,可以看到这个APP,如图。