android測試架構
來源:互聯網
上載者:User
本文主要介紹
android測試架構的特性,
包含測試的結構、
用來建立測試的api、
用來運行測試和查看結果的工具。本文不免有硬翻譯sdk之嫌,只是用來對android的測試架構做個大致介紹,具體的範例程式碼正在整理,下月blog記錄下
一、測試架構特性android測試架構作為android開發環境的一個重要部分,可以用來測試應用的各個方面,從單元測試到架構測試。這個測試架構擁有如下特性:1、
基於junit:android的測試套件是基於JUnit 3的(所以不完全相容JUnit 4),因而你可以使用普通的junit而不調用android的測試api來進行測試,當然我們推薦使用android的測試api更高效全面的進行測試。2、
組件的測試:android的junit擴充提供了針對組件的測試案例類,這些類提供了mock對象和方法的輔助方法,進而控制組件生命週期。3、
測試工程同應用工程類似:測試案例類包含在類似主程式包的測試包中,所以無需學習其他的技術和工具。4、
自動建立測試工程:用於自動構建和運行測試的sdk工具在eclipse adt中可用,其他ide中可以使用命令完成。它們可以讀取源項目的資訊自動完成測試類別的建立。5、
自動事件流類比工具monkeyrunner和monkey:可以用來進行ui測試,都可以向裝置發送事件流(鍵盤、touch、手勢)對程式進行壓力測試,其中monkeyrunner需要編寫python程式調用api發送事件流,monkey通過adb的命令列發送。更詳細的可以見七的介紹。
二、測試架構結構下面為測試架構的結構圖:通過我們發現了以下幾點a.
測試package和應用package運行在同一個進程中,通過 InstrumentationTestRunner進行互動。而一般情況下應用是運行在自己獨立的dalvik進程中,而測試package和應用 package為兩個工程,它們如何運行在同一個進程中的呢?InstrumentationTestRunner的作用呢?這些稍後我們都將解釋。b.
測試載入器以及monkey和monkeyrunner都運行在進程之外。並且也是通過InstrumentationTestRunner進行互動。c. 測試package由test case classed和mock objects組成。
三、android 測試案例結構android 測試案例結構同Junit差不多,比較顯著的差別就是測試案例會單獨放在一個工程中進行管理,並且可以通過自動化的方式(ide外掛程式或者命令列)建立好測試工程。可以參考:
四、用於測試的api4.1 JunitJUnit3 的api可以在android中使用。android的 AndroidTestCase 也是繼承自JUnit的TestCase。其他像assert也類似
4.2 Instrumentation
instrumentation是android系統一系列控制函數和鉤子的集合。這些鉤子使得android控制項獨立於其正常的生命週期以及系統如何載入程式。說的俗點,就是android自己給自己開的後門。。 a.
顯式控制系統組件生命週期。通常情況下,組件的生命週期是由系統控制的,例如大家熟悉的 activity生命週期的相應函數onCreate、onResume、onStop等函數都是由系統自行調用,並且android應用程式框架並沒有提供 許可權讓使用者直接調用,但是在instrumentation中卻可以調用。 b.
測試和程式運行在同一進程中。android應用的組件(除content providers等外)都運行在同一個dalvik進程中,並且無法讓應用同另外一個應用運行在同一個進程中。但是instrumentation能讓 測試程式和相應應用運行在同一進程中,這樣就可以方便的進行組件生命週期控制和資料訪問。現在我們知道了上面結構圖中的第一個疑問。
4.3 測試案例類4.3.1 AndroidTestCase 繼承自TestCase,功能類似JUnit的TestCase,含有經典的setUp和tearDown函數。同時提供了測試許可權以及通過解除類引用防止記憶體流失的方法。 4.3.2
Component-specific test cases 面向組件的測試案例。包括Activity Testing,Content Provider Testing、Service Testing。並沒有單獨提供BroadCastReceiver,因為它可以通過傳遞intent進行測試。 4.3.3 ApplicationTestCase使用 ApplicationTestCase測試應用對象的setUp和tearDown。這些對象維護著應用的全域狀態。這些測試案例可以校正manifest檔案中的application元素的配置。 4.3.4 InstrumentationTestCase如果想在測試案例中使用instrumentation方法,必須使用 InstrumentationTestCase 或其子類,比如Activity的測試案例就繼承自InstrumentationTestCase,並且擴充了其他在Activity測試中實用的功能。 4.4
Assertion classes同Junit測試一樣,android測試中也可以使用assert展示測試結果。除了Junit的assert類可用外,android測試api還提供了MoreAsserts和ViewAsserts。其中
MoreAsserts
提供了更強大的assert功能,比如Regex的比較、順序比較、更豐富對象的equal判斷等。
ViewAsserts
提供了Views即UI的幾何和對齊測試。如位置、對其、views包含判斷。
4.5 Mock object classes依賴注入可以方便測試,android提供了類,用於mock Context、ContentProvider、ContentResolver、Service等系統對象,有些還提供intent對象的mock。
你可以使用這些mocks將某個測試點獨立出來或是方便測試的依賴注入。這些類可以在android.test和android.test.mock的包中找到。android提供了兩類mock對象的類a.Simple mock object classes這些類提供了一個簡單的mock策略,他們廢止了對應的系統對象,如果調用相應系統對象就會拋出異常。通過重寫方法達到mock依賴的目的。包括
MockApplication
,
MockContext
,
MockContentProvider
,
MockCursor
,
MockDialogInterface
,
MockPackageManager
, and
MockResources
。b.Resolver mock objects通過提供獨立的解析器將資料供應商和測試分離,可以自己增加資料並經行解析以滿足需要。見
MockContentResolver
4.6 上下文測試android提供了兩個上下文測試類別a. IsolatedContext這個類允許你在不影響裝置真實展現的資料情況下測試應用的資料操作。提供了獨立的context、檔案、目錄和資料庫操作可以在測試中使用。 b. RenamingDelegatingContext這個類快速為資料操作提供了獨立的資料,並且保持了其他context操作正常的功能
五、 測試執行test runner是用來執行測試案例的,可以載入測試類、set ups、runs和銷毀每個測試案例。為了執行測試,需要在manifest檔案中指定test runner.
InstrumentationTestRunner支援所有類型的測試,可以運行所有的測試案例。 可以在manifest檔案的instrumentation節點中指定其或其子類。InstrumentationTestRunner代碼在公用類庫 android.test.runner中, 而沒有包含在android代碼中。所以為了使用它,需要在uses-library節點中聲明。這些都不需要手動完成,通過ide或是命令列建立工程已 經自動完成。這裡解決了上面結構圖中始終通過InstrumentationTestRunner互動的原因。
系統載入和啟動test包之後會kill原來的應用進程,重啟執行個體,然後將控制權交給InstrumentationTestRunner。
六、 查看測試結果android測試結果會返回給啟動它的工具,可以查看啟動並執行測試案例名和方法名以及具體出錯的行。對於eclipse會在junit新的面板中展現,對於命令列在標準輸出中展示
七、 monkey and monkeyrunnersdk提供了兩個函數級的應用測試載入器a. UI/Application Exerciser Monkey經常叫做monkey。通過adb啟動並執行一個命令列工具,通過向裝置發送表示keystrokes、touches或者gestures 的事件流,
對系統或具體應用進行壓力測試,並且能自動報告遇到的錯誤。用法樣本如下:adb shell monkey -p your.package.name -v 500 b. monkeyrunner 提供了用於編寫python 程式的api和執行環境,通過自己編寫的程式可以在android代碼外可以控制android裝置,比如安裝、運行應用程式和測試包,向程式發送事件流,頁面並儲存。 monkeyrunner工具不同於monkey(UI/Application Exerciser Monkey)。
monkey是運行在adb的命令列工具,用來產生使用者和系統的事件流,可隨機性很大;而monkeyrunner 通過api發送特定的命令和事件,一般需要自己編寫python程式調用api完成。