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();  

 

 

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