android基礎知識12:android自動化測試06—Instrumentation 04 解析

來源:互聯網
上載者:User

       已經在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類結構,如所示

其包含有2個內部類:ActivityMoniter、ActivityResult

  • ActivityMoniter:有關特定的Intent的監視。一個ActivityMoniter類的執行個體通過函數addMonitor(Instrumentation.ActivityMonitor)添加到當前instrumentation中,一旦添加後,每當啟動一個新的Activity,ActivityMoniter就會檢測,如果匹配,其hit count計數更新等其他動作。 一個ActivityMonitor也可以用來尋找一個Activity,通過waitForActivity()方法,這個函數將返直到匹配的活動被建立。
  • ActivityResult:一個活動執行的結果說明,返回到原來的活動。

然後我們看下Instrumentation類的函數,列舉其主要函數如下:

  • 添加、刪除ActivityMoniter;

  • Application、Activity的建立與生命週期的控制;

  • 控制Instrumentation的運行;

  • 發送按鍵、滾動球等事件訊息到當前視窗;

  • 同步方面的操作;
  1. 建立一個Activity直到Activity開始運行;
  2. 在主線程中執行一個調用,主線程被阻滯直到調用結束 ;
  3. 當主線程閒置時候(沒有訊息等待處理)執行一個調用;
  4. 同步等待主線程處於空閑期

        看了這些,我們在結合前面說的2個方面:制Activity的生命週期與同步方面的問題,在Instrumentation類中都實現了,尤其是些同步操作方面的。
Instrumentation簡單使用的例子

public class HelloTest extends InstrumentationTestCase{Hello mActivityTested;public HelloTest() {}//@Overrideprotected 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);}//@Overrideprotected void tearDown() throws Exception{mActivityTested.finish();super.tearDown();}}

         在這裡我們使用InstrumentationTestCase類的getInstrumentation()函數擷取Instrumentation對象,通過Instrumentation的startActivitySync()函數啟動一個Activity,直到Avtivity啟動後返回。

AndroidManifest.xml中的<instrumentation>標籤說明

開啟AndroidManifest.xml檔案後,將會看到AndroidManifest.xml編輯工具,通過這個工具我們可以很方面的在AndroidManifest.xml添加元素

選擇Instrumentation面板後,我們就可以編輯Instrumentation標籤了,介面如何操作在這裡就不說明了,主要說明屬性值的意義:

總結說明
         學習完了Instrumentation,心中的很多問題都沒有了,還需要到Android SDK中去深入的學習這個類,才能更好的測試Activity對象。

參考資料:

android.app.instrumentation解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.