Android Instrumentation Test
前面介绍了JUnit测试,JUnit测试只能测试纯Java代码,更多时候我们要测试和Android相关的代码,这时就要用到Android Instrumentation Test。
这里举一个最简单的例子,通过测试代码,让被测试APP弹一个Toast。
除了Java以外,弹Toast还需要三个和Android有关的条件:
- 访问Android Java API中的Toast接口。
- 需要一个Context对象。
- 在被测试APP的UI线程中执行show方法。
访问Android API是没有问题的,因为测试代码也是Android工程中的一部分。Context对象和UI线程,则需要利用Android测试相关的API了。
编写测试代码
这里使用的Test Runner还是默认的Instrumentation Test Runner。这个Test Runner提供了一系列测试接口,包括ActivityTestCase,ApplicationTestCase,InstrumentationTestCase,ActivityInstrumentationTestCase2(ActivityInstrumentationTestCase已弃用)等。
在androidTest目录下创建一个类,例如MainActivityTest,代码如下。
-
public class MainActivityTest extends ActivityInstrumentationTestCase2 {
-
public MainActivityTest() {
-
super(MainActivity.class);
-
}
-
public void testShowToast() throws Throwable {
-
final Context context = getActivity();
-
runTestOnUiThread(new Runnable() {
-
@Override
-
public void run() {
-
Toast.makeText(context, "Test !", Toast.LENGTH_LONG).show();
-
}
-
});
-
Thread.sleep(5000);
-
}
-
}
测试代码和API说明
这个类继承自ActivityInstrumentationTestCase2,有一个没有参数的public构造方法,并在其中调用父类的构造方法,将MainActivity.class传入。运行时,MainActivity实例就会被Instrumentation创建。
在测试方法testShowToast中:
-
通过getActivity()方法可以获取MainActivity实例,于是Context对象就有了。
-
通过runTestOnUiThread可以在UI线程执行Runnable,从而可以弹出Toast。
-
调用Thread.sleep(5000)延时5s,测试方法执行结束,APP就会退出。
-
还可以通过getInstrumentation()方法获取Instrumentation对象,从而可以给APP发送用户操作事件。这里没用到。
要注意的是,getActivity()方法不能在UI线程的Runnable中执行,以及runTestOnUiThread和Thread.sleep方法都可能会抛出异常。
运行测试
编写完成后,运行这个测试类,就可以看到Android模拟器中MainActivity启动,弹出Toast,5s后APP退出,同时Android Studio中提示测试通过。
通过ActivityInstrumentationTestCase2等API,我们已经可以利用测试代码启动Activity、获取Context、调用待测试程序中的方法、获取Instrumentation从而发送用户事件等,从而进行很多安卓代码的单元测试了。