AndroidTest學(xué)習(xí)(1)Android測試基礎(chǔ)(部分搬運)

使用AndroidStudio創(chuàng)建工程的時候總會發(fā)現(xiàn)自動構(gòu)建出一個同名的包后面括號標(biāo)注(AndroidTest)或者(Test)
所以就上網(wǎng)查了一些關(guān)于AndroidTest的文章

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

Testing和Instrumentation

Android提供了一系列強大的測試工具,它針對Android的環(huán)境,擴展了業(yè)內(nèi)標(biāo)準(zhǔn)的JUnit測試的框架,盡管你可以試用JUnit測試Android工程,但是Android工具允許你為應(yīng)用程序的各方面進行更為復(fù)雜的測試,包括單元層面及框架層面.

Android測試環(huán)境的主要特征有:

  • 可以訪問Android系統(tǒng)對象.
  • Instrumentation框架可以控制和測試應(yīng)用程序.
  • Android系統(tǒng)常用對象的模擬版本.
  • 運行單個的Test或Test Suite的工具,帶或不帶Instrumentation

概要

Android測試環(huán)境的核心是一個Instrumentation框架,在這個框架下你的測試應(yīng)用程序可以精確控制應(yīng)用程序.試用Instrumentation,你可以在主程序啟動之前,創(chuàng)建模擬的系統(tǒng)對象,如Context;控制應(yīng)用程序的多個生命周期;發(fā)送UI事件給應(yīng)用程序;在執(zhí)行期間檢查程序狀態(tài),.Instrumentation框架將通過主程序和測試程序運行在同一個進程來實現(xiàn)這些功能.

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

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

TestingAPI

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

JUnit TestCase類

繼承自JUnit的TestCase,不能使用Instrumentation框架.但這些類包含訪問系統(tǒng)對象(如Context)的方法,使用Context,你可以瀏覽資源,文件,數(shù)據(jù)庫等等,基類是AndroidTestCase,一般常見的是它的子類,和特定的文件關(guān)聯(lián),
子類有

  • ApplicationTestCase:測試整個應(yīng)用程序的類
    它允許你注入一個模擬的Context到應(yīng)用程序中,在應(yīng)用程序啟動之前初始化測試參數(shù),并在應(yīng)用程序結(jié)束之后銷毀之前檢查應(yīng)用程序.
  • ProviderTestCase2:測試單個ContentProvider的類
    因為它要求使用MockContentRosolver,并注入一個IsolateContext,因此Provider的測試是與OS孤立的
  • ServiceTestCase:測試單個Service類
    你可以注入一個模擬的Context或者Application(或者兩者),或者讓Android為你提供Context和MockApplication.

InstrumentationTestCase類

繼承自Junit的TestCase,并可以使用Instrumentation框架,用于測試Activity,試用Instrumentation,Android可以向程序發(fā)送事件來自動進行UI測試,并可以精確控制Activity的啟動,監(jiān)測Activity的生命周期狀態(tài),

基類是InstrumentationTestCase,它的所有子類都能發(fā)送按鍵或者觸摸事件給UI,子類還可以注入一個模擬的Intent,
子類有

  • ActivityTestCase:Activity測試類的基類
  • SingleLunchActivityTestCase:測試單個的Activity的類,它能出發(fā)一次setUp(),和tearDown(),而不是每個方法調(diào)用時都觸發(fā),如果你的測試方法都是針對同一個Activity的話,那就試用它吧
  • SyncBaseInstrumentation:測試ContentProvider同步的類,它用Instrumentation在啟動測試之前取消已經(jīng)存在的同步對象,
  • ActivityUnitTestCase:對單個的Activity進行單一測試的類,使用它,你可以注入模擬的Context或Application,或者兩者.它用于對Activity進行單元測試,不同于其他的Instrumentation類,這個測試類不能注入模擬的Intent
  • ActivityInstrumentationTestCase2:在正常系統(tǒng)環(huán)境中測試單個的Activity的類.你不能注入一個模擬的Context,但你可以注入一個模擬的Intent,另外,你可以在UI線程(應(yīng)用程序的主線程)運行測試方法,并且可以給應(yīng)用程序UI發(fā)送按鍵和觸摸事件.

Assert類

Android還繼承了JUnit的Assert類,其中有兩個子類:MoreAssertsViewAsserts:

  • MoreAsserts類包含更多強大的斷言方法,如assertContainsRegex(String string),可以作正則表達式的匹配
  • ViewAsserts類包含關(guān)于AndroidView的有用斷言方法,如asserHasScreenCoordinates(View view,int ,int),,可以測試View在可視區(qū)域的特定X,Y的位置,這些Assert簡化了UI中幾何圖形和對其方式的測試,

Mock對象類

Android有一些類可以方便的創(chuàng)建模擬的系統(tǒng)對象,如Application,Context,ContentProvider和Resource,Android還在一些測試類中提供了一些方法來創(chuàng)建模擬的Intent,因為這些模擬器的對象比實際對象更容易使用,因此,試用它們能簡化依賴注入,你可以在android.testandroid.test.mock中找到這些類
它們是

  • IsolateContext:模擬一個Context,這樣應(yīng)用程序可以孤立運行,與此同時,還有大量的代碼幫助我們完成與Context的通信,這個類在單元測試時很有用,
  • RenamingDelegatingContext:當(dāng)修改默認文件和數(shù)據(jù)庫名時,可以委托大多數(shù)的函數(shù)到一個存在的,常規(guī)的Context上,試用這個類來測試文件和數(shù)據(jù)庫與正常系統(tǒng)Context之間的操作
  • MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources:創(chuàng)建模擬的系統(tǒng)對象的類,它們只暴露那些對對象的管理有用的方法,這些方法的默認實現(xiàn)只是拋出異常,你需要繼承這些類,并重寫這些方法.

InstrumentationTestRunner

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

在測試環(huán)境中工作

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

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

測試工程

為了開始對一個Android程序測試,你需要使用Android工具創(chuàng)建一個測試工程,工具會創(chuàng)建工程文件夾,文件和所需要的子文件夾,工具還會創(chuàng)建一個Manifest文件,指定被測試的應(yīng)用程序,

測試用例

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

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

AndroidInstrumentationTestCase2設(shè)計用于設(shè)計一些功能性的測試,因此它在一個正常的系統(tǒng)環(huán)境中測試Activity,你可以注入Intent,但不能是模擬的Context,一般來說你不能模擬Activity之間的以來關(guān)系,

相比而言,ActivityUnitTestCase設(shè)計用于單元測試,因此它在一個孤立的系統(tǒng)環(huán)境中測試Activity,換句話說,當(dāng)你用這個測試類時,Activity不能與其他的Activity交互,
作為一個經(jīng)驗法則,如果想測試Activity與Android之間的交互的話,使用AndroidInstrumentationTestCase2,如果想對一個Activity作回歸測試的話,使用AndroidUnitTestCase,

測試方法

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

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

運行測試并查看結(jié)果

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

測試什么

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容