Android Instrumentation基础使用

Android Instrumentation基础使用

http://stream-town.iteye.com/blog/2020299

    这两天准备研究Robotium的源码,不过由于Robotium是以Instrumentation为基础的,因此就先补习了一下Instrumentation的基础。

    Instrumentation是Android自带一个单元测试框架,不过虽然这么说,其对于大部分应用开发人员来讲,最大的作用反而是用于功能或UI测试。

 

    整个框架继承自JUnit框架,使用方法也类似,也是要继承TestCase类。不过在Instrumentation中,需要继承的是几个Google提供的TestCase的子类,其中最重要也是最常用的是ActivityInstrumentationTestCase2这个类,一般进行应用界面测试时都需继承此类(Robotium一般也是使用此类)。当然,Android也提供了几个其他选择用于测试其他组件:

 

 

    这几个类全部基于AndroidTestCase类,只不过根据各个组件的特性提供了不同的get方法,如getActivity(), getService()等等,而AndroidTestCase继承于junit的TestCase类,所以所有测试类遵循单元测试框架。

 

    要写一个APK的Instrumentation测试,首先准备一个测试目标——即待测试的APK。然后再建立一个APK作为测试APK,在Manifest中添加如下声明(其中targetPackage一项需要填写测试目标的包名):

Xml代码  收藏代码
  1. <instrumentation  
  2.     android:name="android.test.InstrumentationTestRunner"  
  3.     android:targetPackage="com.test.target" />  

 

    同时,还需在Application标签中嵌入如下声明:

Xml代码  收藏代码
  1. <uses-library android:name="android.test.runner" />  

     

    声明完毕,可以开始写测试代码了,如下:

 

Java代码  收藏代码
  1. package com.tc.upnptest.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Instrumentation.ActivityMonitor;  
  5. import android.app.Instrumentation.ActivityResult;  
  6. import android.content.Intent;  
  7. import android.os.SystemClock;  
  8. import android.test.ActivityInstrumentationTestCase2;  
  9. import android.util.Log;  
  10. import android.widget.Button;  
  11. import android.widget.TextView;  
  12.   
  13. public class MainTest extends ActivityInstrumentationTestCase2{  
  14.         private Activity target;  
  15.         private TextView tx;  
  16.   
  17.     public MainTest() throws ClassNotFoundException {  
  18.         super(Class.forName("com.test.target.MainActivity"));  
  19.     }  
  20.       
  21.     @Override  
  22.     protected void setUp() throws Exception {  
  23.         super.setUp();  
  24.                 target =  getActivity();  
  25.                 tx = (TextView) a.findViewById(0x7f060000);  
  26.     }  
  27.   
  28.     @Override  
  29.     protected void tearDown() throws Exception {  
  30.         super.tearDown();  
  31.     }  
  32.       
  33.     public void testMain() {  
  34.         dosomething();  
  35.                 assertTrue(true);  
  36.     }  
  37. }  
   

    首先写一个类继承ActivityInstrumentationTestCase2,如上面的MainTest。需要注意的是此类的构造方法不要加任何参数,在构造方法中直接调用super(Class)即可,其中Class就是要测的Activity的Class。

 

    getActivity()会自动获取Activity对象(就是上面声明的Class对应的Activity),如果Activity没有启动则会自动启动。如果想要主动启动Activity,可以用launchActivityWithIntent,或instrumentation.startActivitySync
 

    另外,在setUp中调用setActivityInitialTouchMode可以让测试目标处于非触摸模式,以防止测试途中误操作。


    写完了测试类,即可开始运行。在eclipse中右击项目,在弹出的菜单中选择Run as → Android JUnit Test运行,即可看到如下界面:

     

    下面的是一些测试中的常用界面操控方法,方法中需要获取instrumentation对象,直接在类中调用getInstrumentation()即可,下面不再赘述。

 

  1. 可以直接获取Activity对象,通过findViewById来获取各个View控件,已完成对于各个View的操作,id值可以通过目标APK的R文件获取。
  2. 测试类仍需遵循Android的基本原则,对于View的更改必须要在UI线程中执行,因此要对View进行直接操作,需要利用runTestOnUiThread(Runnable r)函数。
  3. 需要对界面直接进行点击、滑动、按键等操作,可以用sendKeys发送一些按键,也可以直接用instrumentation类中的sendKeyDownUpSyncsendKeySyncsendPointerSync等方法发送原始的事件。

   

    当测试时有Activity跳转时,可以用ActivityMonitor捕获新的Activity,如下操作:

Java代码  收藏代码
  1. ActivityMonitor am = new ActivityMonitor("com.test.target.Activity2"nullfalse);  
  2. getInstrumentation().addMonitor(am);  
  3. Activity b = getInstrumentation().waitForMonitor(am);  

 

    测试时往往需要等待一个UI事件执行完毕,再进行下一个测试操作,这时可以直接调用

 

Java代码  收藏代码
  1. getInstrumentation().waitForIdleSync();  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章