1. 程式人生 > >Android自動化測試框架開發(三)Instrumentation測試框架

Android自動化測試框架開發(三)Instrumentation測試框架

本篇開始將介紹幾個重量級的測試框架,首先介紹的是Android最早推出的便於進行程式深入的,系統性的單元測試的框架–Instrumentation。

Instrumentation從android2.3甚至更早版本就存在了,很多Android自動化測試框架都是對於Instrumentation的直接使用或二次開發,例如:Robotium。

在學習Instrumentation之前,先了解一下Junit,作為一款成熟的單元測試框架,Junit的目的非常明確:通過該框架可以為被測程式碼編寫相應的測試程式碼,快速定位錯誤,節省除錯時間,最終提高程式碼健壯性。

在測試Android程式時,也可以使用Junit進行測試,但是有前提條件,測試的case中不能存在Android的API相關的測試用例,也就是說只能包含Java層相關的測試。

因為在Junit設計初期,不可能考慮到Android系統的各種要求,但是一個Android應用自然會包含各種控制元件,activity,service等Android自身特有的東西,而要將Junit的思想應用到Android系統上,就必須針對Android系統的各種要求對Junit進行擴充套件,進行二次封裝。Instrumentation也就應運而生。

Instrumentation 是Android SDK在Junit上的擴充套件,提供了AndroidTestCase類及系列子類,其中一個最重要的類是ActivityInstrumentationTestCase2;

使用Instrumentation測試時,需在測試類中繼ActivityInstrumentationTestCase2。
然後重寫幾個方法,setUp(),tearDown();
而測試的用例,要命名為void testXXX()格式,將測試的過程填充到此方法中。

ActivityInstrumentationTestCase2允許測試類TestCase.launchActivity來啟動被測試的Activity。

而且ActivityInstrumentationTestCase2還支援在UI執行緒中執行測試方法,並能注入intent物件到被測試的Activity中,這樣就可以直接操作被測試的Activity了。

舉例:在被測試的應用程式中,有一個Button,一個Edit和一個TextView,主要的工作就是在EditText中輸入文字,點選Button之後,在TextView中顯示。

我們如何寫個測試Case來測試這個功能呢?首先要先啟動Activity,獲取這個被測Activity例項,其次在setUp()中獲取到上述的幾個控制元件,與開發過程相同;最後命名一個testXXX()用例,在此方法中先在EditText中setText,然後在Button方法中,獲取EditText內容,再setText到TextView中;進行驗證,TextView中是否顯示EditText設定的內容。如果測試成功,整體流程在tearDown()執行之後結束。

思想上很好理解,就是通過事件注入的方式,實現應用程式的一系列自動化操作,然後進行結果的驗證。

總結一下,Instrumentation框架的執行流程:
(1)啟動應用Activity:Intent
(2)獲取Activity例項:Instrumentation
(3)過去Activity中控制元件的例項:findViewById
(4)執行控制元件的操作
(5)驗證是否為預想情況

分析:

優點:

  • Instrumentation是基於專案原始碼進行開發
  • 測試指令碼的穩定性好(控制元件ID改動較少)
  • 可移植性好(基於控制元件ID,而不是畫素點)
  • 執行效率高(直接呼叫控制元件進行操作)
  • 除錯方便(可配合原始碼一起除錯)

缺點:

  • 對指令碼開發人員要求高,要熟悉Java語言,Android框架執行機制等,難以上手

  • 最大的問題是不支援多應用互動,因為測試指令碼與被測App執行在同一程序中,而Android系統自身不允許程序間相互訪問,無法直接啟動另一個程序的Activity,只能定義Intent(隱式),然後由系統選擇能夠處理這個Intent的Activity。

Instrumentation為我們開發自動化測試框架提供了一個基礎的原型,在開發過程中,很多功能就是根據Instrumentation進行的開發和二次封裝。

而為了解決跨程序的問題,Android提供了另一個測試框架,UIAutomator,後文將繼續介紹。