Android测试初探(三) 单元测试实例:基本的Android代码测试

Android Instrumentation Test

前面介绍了JUnit测试,JUnit测试只能测试纯Java代码,更多时候我们要测试和Android相关的代码,这时就要用到Android Instrumentation Test。

这里举一个最简单的例子,通过测试代码,让被测试APP弹一个Toast。

除了Java以外,弹Toast还需要三个和Android有关的条件:

  1. 访问Android Java API中的Toast接口。
  2. 需要一个Context对象。
  3. 在被测试APP的UI线程中执行show方法。

访问Android API是没有问题的,因为测试代码也是Android工程中的一部分。Context对象和UI线程,则需要利用Android测试相关的API了。

编写测试代码

这里使用的Test Runner还是默认的Instrumentation Test Runner。这个Test Runner提供了一系列测试接口,包括ActivityTestCase,ApplicationTestCase,InstrumentationTestCase,ActivityInstrumentationTestCase2(ActivityInstrumentationTestCase已弃用)等。

在androidTest目录下创建一个类,例如MainActivityTest,代码如下。

  1. public class MainActivityTest extends ActivityInstrumentationTestCase2 {

  2. public MainActivityTest() {

  3. super(MainActivity.class);

  4. }

  5. public void testShowToast() throws Throwable {

  6. final Context context = getActivity();

  7. runTestOnUiThread(new Runnable() {

  8. @Override

  9. public void run() {

  10. Toast.makeText(context, "Test !", Toast.LENGTH_LONG).show();

  11. }

  12. });

  13. Thread.sleep(5000);

  14. }

  15. }

测试代码和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从而发送用户事件等,从而进行很多安卓代码的单元测试了。