AndroidTest學習(1)Android測試基礎(部分搬運)

使用AndroidStudio創建工程的時候總會發現自動構建出一個同名的包後面括號標註(AndroidTest)或者(Test)
所以就上網查了一些關於AndroidTest的文章

原文地址:http://blog.chinaunix.net/uid-20771867-id-121133.html
AndroidStudio下使用AndroidTest的英文書籍:http://pan.baidu.com/s/1skbOBrn (本書的Chapter11)“`

Testing和Instrumentation

Android提供了一系列強大的測試工具,它針對Android的環境,擴展了業內標準的JUnit測試的框架,儘管你可以試用JUnit測試Android工程,但是Android工具允許你爲應用程序的各方面進行更爲複雜的測試,包括單元層面及框架層面.

Android測試環境的主要特徵有:
- 可以訪問Android系統對象.
- Instrumentation框架可以控制和測試應用程序.
- Android系統常用對象的模擬版本.
- 運行單個的Test或Test Suite的工具,帶或不帶Instrumentation

概要

Android測試環境的核心是一個Instrumentation框架,在這個框架下你的測試應用程序可以精確控制應用程序.試用Instrumentation,你可以在主程序啓動之前,創建模擬的系統對象,如Context;控制應用程序的多個生命週期;發送UI事件給應用程序;在執行期間檢查程序狀態,.Instrumentation框架將通過主程序和測試程序運行在同一個進程來實現這些功能.

通通在測試工程的Manifest文件中添加元素來指定要測試的應用程序.這個元素的特性指明瞭要測試的應用程序包名,以及高速Android程序該如何運行測試程序,在InstrumentationTestRunner章節有更多的細節描述.

在Android中,測試程序也是Android程序,,因此它和被測試程序的書寫方式,有很多相同的地方,SDK工具能幫助你同事創建主程序及它的測試工程,

TestingAPI

Android提供了基於JUnit測試框架的測試API來書寫測試用例和測試程序.另外Android海提供強大的Instrumentation框架,允許測試用例訪問程序的狀態及運行時的對象.
下面的章節描述了Android測試中可利用的主要測試API.

JUnit TestCase類

繼承自JUnit的TestCase,不能使用Instrumentation框架.但這些類包含訪問系統對象(如Context)的方法,使用Context,你可以瀏覽資源,文件,數據庫等等,基類是AndroidTestCase,一般常見的是它的子類,和特定的文件關聯,
子類有
- ApplicationTestCase:測試整個應用程序的類
它允許你注入一個模擬的Context到應用程序中,在應用程序啓動之前初始化測試參數,並在應用程序結束之後銷燬之前檢查應用程序.
- ProviderTestCase2:測試單個ContentProvider的類
因爲它要求使用MockContentRosolver,並注入一個IsolateContext,因此Provider的測試是與OS孤立的
- ServiceTestCase:測試單個Service類
你可以注入一個模擬的Context或者Application(或者兩者),或者讓Android爲你提供Context和MockApplication.

InstrumentationTestCase類

繼承自Junit的TestCase,並可以使用Instrumentation框架,用於測試Activity,試用Instrumentation,Android可以向程序發送事件來自動進行UI測試,並可以精確控制Activity的啓動,監測Activity的生命週期狀態,

基類是InstrumentationTestCase,它的所有子類都能發送按鍵或者觸摸事件給UI,子類還可以注入一個模擬的Intent,
子類有
- ActivityTestCase:Activity測試類的基類
- SingleLunchActivityTestCase:測試單個的Activity的類,它能出發一次setUp(),和tearDown(),而不是每個方法調用時都觸發,如果你的測試方法都是針對同一個Activity的話,那就試用它吧
- SyncBaseInstrumentation:測試ContentProvider同步的類,它用Instrumentation在啓動測試之前取消已經存在的同步對象,
- ActivityUnitTestCase:對單個的Activity進行單一測試的類,使用它,你可以注入模擬的Context或Application,或者兩者.它用於對Activity進行單元測試,不同於其他的Instrumentation類,這個測試類不能注入模擬的Intent
- ActivityInstrumentationTestCase2:在正常系統環境中測試單個的Activity的類.你不能注入一個模擬的Context,但你可以注入一個模擬的Intent,另外,你可以在UI線程(應用程序的主線程)運行測試方法,並且可以給應用程序UI發送按鍵和觸摸事件.

Assert類

Android還繼承了JUnit的Assert類,其中有兩個子類:MoreAssertsViewAsserts:
- MoreAsserts類包含更多強大的斷言方法,如assertContainsRegex(String string),可以作正則表達式的匹配
- ViewAsserts類包含關於AndroidView的有用斷言方法,如asserHasScreenCoordinates(View view,int ,int),,可以測試View在可視區域的特定X,Y的位置,這些Assert簡化了UI中幾何圖形和對其方式的測試,

Mock對象類

Android有一些類可以方便的創建模擬的系統對象,如Application,Context,ContentProvider和Resource,Android還在一些測試類中提供了一些方法來創建模擬的Intent,因爲這些模擬器的對象比實際對象更容易使用,因此,試用它們能簡化依賴注入,你可以在android.testandroid.test.mock中找到這些類
它們是
- IsolateContext:模擬一個Context,這樣應用程序可以孤立運行,與此同時,還有大量的代碼幫助我們完成與Context的通信,這個類在單元測試時很有用,
- RenamingDelegatingContext:當修改默認文件和數據庫名時,可以委託大多數的函數到一個存在的,常規的Context上,試用這個類來測試文件和數據庫與正常系統Context之間的操作
- MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources:創建模擬的系統對象的類,它們只暴露那些對對象的管理有用的方法,這些方法的默認實現只是拋出異常,你需要繼承這些類,並重寫這些方法.

InstrumentationTestRunner

Android提供了自定義的運行測試用例的類,叫做InstrumentationTestRunner.這個類控制應用程序處於測試環境中,在同一個進程中運行測試程序和主程序,,並將測試結果輸出到合適的地方,InstrumentationTestRunner在運行是對整個運行環境的控制能力的關鍵是試用Instrumentation,注意,如果你的測試類不使用Instrumentation的話,你也可以用這個TestRunner,
當你運行一個測試程序時,首先會運行一個系統工具叫做ActivityManager,ActivityManager使用Instrumentation框架,來啓動和控制TestRunner,這個TestRunner反過來又使用Instrumentation來關閉任何主程序的實例,然後啓動測試程序和主程序(在同一個進程中,),這樣能確保測試程序和主程序的直接交互,

在測試環境中工作

對Android程序的測試都包含在一個測試程序裏,它本身也是一個Android應用程序,測試程序以單獨的Android工程存在,與正常的Android程序有相同的文件和文件夾,測試工程在Manifest中指定要測試的Android應用程序,

每個測試程序包含一個或多個針對特定類型組件的測試用例.測試用例裏定義了測試應用程序某些部分的測試方法,當你運行測試程序,Android會在相同的進程里加載主程序,然後出發每個測試用例裏的測試方法,

測試工程

爲了開始對一個Android程序測試,你需要使用Android工具創建一個測試工程,工具會創建工程文件夾,文件和所需要的子文件夾,工具還會創建一個Manifest文件,指定被測試的應用程序,

測試用例

一個測試程序包含一個或多個測試用例,它們都繼承自AndroidTestCase類,選擇一個測試用例取決於你要測試的Android組件的類型以及你要作什麼樣的測試,一個測試程序可以測試不同的組件,但每個測試用例類類設計時只能測試單一類型的組件,

一些Android組件有多個關聯的測試用例類,在這種情況下可以選擇,類間,你需要判你要進行的測試類型,例如對於Activity來說,你有兩個選擇,ActivityInstrumentationTestCase2,和ActivityUnitTestCase,

AndroidInstrumentationTestCase2設計用於設計一些功能性的測試,因此它在一個正常的系統環境中測試Activity,你可以注入Intent,但不能是模擬的Context,一般來說你不能模擬Activity之間的以來關係,

相比而言,ActivityUnitTestCase設計用於單元測試,因此它在一個孤立的系統環境中測試Activity,換句話說,當你用這個測試類時,Activity不能與其他的Activity交互,
作爲一個經驗法則,如果想測試Activity與Android之間的交互的話,使用AndroidInstrumentationTestCase2,如果想對一個Activity作迴歸測試的話,使用AndroidUnitTestCase,

測試方法

每個測試用例提供了可以建立測試環境和控制應用程序的方法,例如所有的測試用例類都提供了JUnit的setUp()方法,來搭建測試環境,另外,你可以添加方法來定義單獨的測試,,當你運行測試程序時,每個添加的方法都運行一次,如果你重寫了setUp方法,它會在每個方法運行前運行,相似的tearDown()方法會在每個方法運行後運行,

測試用例提供了大量的對組件啓動和停止控制的方法,由於這個原因,在運行測試之前,你需要明確告訴Android啓動一個組件,例如你可以用getActivity()來啓動一個Activity,在整個測試用例期間,你只能調用這個方法一次,或者每個測試方法一次,甚至你可以在單個的測試方法中,用它的finishing()來銷燬Activity,然後再調用getActivity()重新啓動一個,

運行測試並查看結果

編譯完測試工程後,你就可以使用系統工具Activity Manager來運行測試程序。你給Activity Manager提供了TestRunner的名(一般是InstrumentationTestRunner,在程序中指定);名包括被測試程序的包名和**TestRunner的名。**Activity Manager加載並啓動你的測試程序,殺死主程序的任何實例,然後在測試程序的同一個進程里加載主程序,然後傳遞測試程序的第一個測試用例。這個時候,TestRunner會接管這些測試用例,運行裏面的每個測試方法,直到所有的方法運行結束

測試什麼

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