轉載處(找到不原文出處,作者請指正):http://blog.csdn.net/xianming01/article/details/7893505
已經在Android SDK中學習了很多關于JUnit的内容,但是感覺一直有幾個問題沒有解決(不知道大家是否有同樣的感受)JUnit的測試都自動化的,完全是不需要任何操作的,有2個問題我一直都還沒有找到答案,這2個問題如下:
JUnit可以用來測試Android的基本組成元素:Activity、Service、Provider,那麼我們如何控制這些基本元素運作的,這需要Android系統提供一些底層操作的接口才可以做到。
如何模拟界面操作,比如說:單擊界面上的按鈕、選擇菜單等。
對于第二個問題,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函數,例如:performClick(),看來Android SDK還是提供了一些這方面的函數來模拟各種操作。對于第一個問題,本篇對這個問題幅詳細說明下。
首先我們先想下,如果要實作對Activity的測試需要些什麼?首先需要建立Activity(這個Android SDK中已經提供了),然後可以控制Activity的生命周期,這些是最基本的。在Android SDK中說明過Activity的建立是異步的,也就是說當我們調用startActivty()後,這個函數立刻傳回,而不是等待Activity建立好後才傳回,這就需要一些同步方面的操作。将前面的概括起來就是2個方面:控制Activity的生命周期與同步方面的問題。Android SDK為我們提供了 instrument,在android.test包中InstrumentationTestCase 類有個函數getInstrumentation()以及通過adb shell am instrument啟動測試例子的方法中,都提到了instrument,下面就對instrumentation詳細說明。
什麼是Instrumentation?
Instrumentation是執行application instrumentation代碼的基類。當應用程式運作的時候instrumentation處于開啟,Instrumentation将在任何應用程式運作前初始化,可以通過它監測系統與應用程式之間的互動。Instrumentation implementation通過的AndroidManifest.xml中的<instrumentation>标簽進行描述。
Instrumentation似乎有些類似與window中的“鈎子(Hook)函數”,在系統與應用程式之間安裝了個“竊聽器”。
android.app包中Instrumentation類結構,如下圖所示

- ActivityMoniter:有關特定的Intent的監視。一個ActivityMoniter類的執行個體通過函數addMonitor(Instrumentation.ActivityMonitor)添加到目前instrumentation中,一旦添加後,每當啟動一個新的Activity,ActivityMoniter就會檢測,如果比對,其hit count計數更新等其他操作。 一個ActivityMonitor也可以用來尋找一個Activity,通過waitForActivity()方法,這個函數将返直到比對的活動被建立。
- ActivityResult:一個活動執行的結果說明,傳回到原來的活動。
然後我們看下Instrumentation類的函數,列舉其主要函數如下:
- 添加、删除ActivityMoniter;
- Application、Activity的建立與生命周期的控制;
- 控制Instrumentation的運作;
- 發送按鍵、滾動球等事件消息到目前視窗;
- 同步方面的操作;
- 建立一個Activity直到Activity開始運作;
- 在主線程中執行一個調用,主線程被阻滞直到調用結束 ;
- 當主線程空閑的時候(沒有消息等待處理)執行一個調用;
- 同步等待主線程處于空閑期
看了這些,我們在結合前面說的2個方面:制Activity的生命周期與同步方面的問題,在Instrumentation類中都實作了,尤其是些同步操作方面的。
Instrumentation簡單使用的例子
[java] view plaincopy
- public class HelloTest extends InstrumentationTestCase
- {
- Hello mActivityTested;
- public HelloTest() {}
- //@Override
- protected void setUp() throws Exception
- super.setUp();
- Intent intent = new Intent();
- intent.setClassName(“com.xmobileapp.hello”, Hello.class.getName());
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mActivityTested = (Hello) getInstrumentation().startActivitySync(intent);
- }
- protected void tearDown() throws Exception
- mActivityTested.finish();
- super.tearDown();
在這裡我們使用InstrumentationTestCase類的getInstrumentation()函數擷取Instrumentation對象,通過Instrumentation的startActivitySync()函數啟動一個Activity,直到Avtivity啟動後傳回。
AndroidManifest.xml中的<instrumentation>标簽說明
打開AndroidManifest.xml檔案後,将會看到AndroidManifest.xml編輯工具,通過這個工具我們可以很方面的在AndroidManifest.xml添加元素