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从而发送用户事件等,从而进行很多安卓代码的单元测试了。
最后,欢迎扫码关注微信公众号。程序员同行学习交流,聊天交友,国内外名企求职内推(微软 / 小冰 / Amazon / Shopee / Coupang / ATM / 头条 / 拼多多等),可加我微信 jzj2015 进技术群(备注进技术群,并简单自我介绍)。

本文由jzj1993原创,转载请注明来源:https://www.paincker.com/android-test-3
(标注了原文链接的文章除外)
暂无评论