如下內容爲原創,歡迎轉載,轉載請註明
來自每天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html
html
翻譯自 Android Developer 官網:http://developer.android.com/tools/testing-support-library/index.htmljava
Android Testing Support Library
爲Android app的測試提供了一個普遍的框架。 這個庫提供了一系列的API可讓你快速build和run你app的代碼,它包括了JUnit 4
和功能性的用戶界面(UI)測試。你能夠經過Android Studio IDE或者命令行的方式運行你使用這些API建立的測試。android
Android Testing Support Library
已經能夠經過Android SDK Manager
下載使用了。詳情可見Testing Support Library Setupshell
這頁中會提供一些關於Android Testing Support Library
中所提供的工具的信息,怎樣在你的測試環境中使用它們,還有庫發佈的相關信息。api
Android Testing Support Library
提供包括瞭如下自動化測試工具:app
AndroidJUnitRunner:兼容Android的JUnit 4。框架
Espresso:UI測試框架,適用於app內的功能性UI測試。工具
UI Automator:UI測試框架,適用於系統和安裝app間跨app的功能性UI測試。佈局
AndroidJUnitRunner 類是一個 JUnit 測試runner,它可讓你在Android設備上運行JUnit 3
或者JUnit 4-style
的測試類,包括使用了 Espresso 和 UI Automator 測試框架的。test runner
處理的事情有 加載你的測試package和須要在設備上測試的app,運行你的測試,還有報告測試結果。這個類會替換掉只支持JUnit 3
測試的InstrumentationTestRunner類。學習
這個test runner
的關鍵特性包括:
須要 Android2.2(API level 8) 或者更高。
Rest runner
兼容JUnit 3
和JUnit 4
(最高到JUnit 4.10
)的測試。無論怎樣,你應該避免在一個package中混合使用JUnit 3和 JUnit 4的代碼,由於這樣作可能會引起一些預料以外的問題。若是你建立了一個JUnit 4的測試類在設備或者模擬器上運行時,你的測試類必需要加上@RunWith(AndroidJUnit4.class)
註解做爲前綴。
下面的代碼片斷展現了你應該怎麼去編寫一個JUnit 4測試來驗證CalculatorActivity
類中的add
操做是正確執行的。
import android.support.test.runner.AndroidJUnit4; import android.support.test.runner.AndroidJUnitRunner; import android.test.ActivityInstrumentationTestCase2; @RunWith(AndroidJUnit4.class) public class CalculatorInstrumentationTest extends ActivityInstrumentationTestCase2<CalculatorActivity> { @Before public void setUp() throws Exception { super.setUp(); // 當你使用`AndroidJUnitRunner`運行測試時, // 注入Instrumentation實例是必要的。 injectInstrumentation(InstrumentationRegistry.getInstrumentation()); mActivity = getActivity(); } @Test public void typeOperandsAndPerformAddOperation() { // 調用CalculatorActivity add()方法並傳入一些操做數據, // 而後檢查返回值是不是指望值 } @After public void tearDown() throws Exception { super.tearDown(); } }
你可使用 InstrumentationRegistry
類來訪問你測試的app的相關信息。這個類包含一個 Instrumentation
對象,目標app的 Context
對象,還有你經過命令行傳入到該測試的參數。這個數據在你使用UI Automator框架編寫測試或者編寫一些依賴 Instrumentation
或者 Context
對象的測試的時候是頗有用的。
在你的 JUnit 4 測試中, 你可使用註解來配置你的測試的運行。這會最大限度地減小你測試中須要的模版代碼和有條件的代碼。除了 JUnit 4 支持的標準註解,test runner
也支持一些針對Android的特殊的註解,包括:
@RequiresDevice
:指明這個測試只能運行的物理設備上面,而不是模擬器上面。
@SdkSupress
:限制這個測試運行在低於給定的Android API level。舉個例子,限制測試運行在API level低於18的環境下,使用註解 @SDKSupress(minSdkVersion=18)
。
@SmallTest
,@MediumTest
,和@LargeTest
:對測試須要的時間運行來分類,所以,能夠決定是否能夠常常運行該測試。
Test runner
支持把一個測試套件分割成多個碎片,因此你能夠很簡單地運行屬於經過碎片分組的全部測試,而且它們使用同一個 Instrumentation
實例。每個碎片都有一個索引編號(index number)做爲它的惟一識別。當運行測試時,使用 -e numShards
選項來指定要建立的碎片的數量和 -e shardIndex
選項來指定哪些碎片運行。
舉個例子,把一個測試套件分割成10個碎片,而且只運行被分組的測試中的第二個碎片,使用如下的命令:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
這個 test runner
的更多相關學習,見 API reference。
Espresso 測試框架提供了一系列的API用於構建UI測試來測試app內用戶流操做。這些API讓你能夠編寫簡潔可靠的自動化UI測試。Espresso很是適合用來編寫白盒測試,其中測試代碼的編寫是利用了被測試app中程序代碼實現細節。
Espresso測試框架的關鍵特性包括:
提供了靈活的API用於匹配目標app中view
和adapter
。更多的信息,見 View 匹配
大而全的 行爲 api
(action APIs) 用於自動化UI交互。更多的信息,見 行爲 APIs
UI線程同步來提升測試可靠性。更多信息,見 UI 線程同步
須要 Android2.2(API level 8) 或者更高。
Espresso.onView()
方法可讓你訪問目標app中的一個UI組件並與它交互。這個方法接收一個 Matcher
做爲參數,而後根據咱們給定的條件在view的層次結構中搜索出對應相符的View
實例。你可使用以下的條件來優化你的搜索結果:
content description
)R.id
舉個例子,尋找一個ID爲my_button
的目標button,你能夠如如下同樣指定一個matcher:
onView(withId(R.id.my_button));
若是搜索是成功的,onView()
方法會返回一個可讓你執行用戶行爲和測試目標中對view斷言的引用。
在一個 AdapterView
的佈局中,佈局是在運行時根據children動態填充的。若是目標view是在 AdapterView
子類(好比ListView
或者 GridView
)的佈局中的,onView()
方法可能就不起做用了,由於當前加載的view層次結構可能只是layout的一個子集。
替代方案是使用 Espresso.onData()
方法去訪問一個目標view元素。Espresso.onData()
方法返回一個可讓你執行用戶行爲和測試目標 AdapterView
中對元素斷言的引用。
典型的,你能夠經過對app的用戶界面執行一些用戶交互來測試app。在你的測試中使用 ViewActions
API 可讓你很容易地自動化這些行爲。你能夠經過如下方式執行這些UI交互:
View的點擊
滑動
按鍵和按鈕的按下
輸入文本
打開一個連接
舉個例子,模擬輸入一個字符串數據並按下按鈕來提交這個值,你能夠像這樣編寫一個自動化測試腳本。 ViewInteraction.preform()
和 DataInteraction.perform()
方法接收一個或者多個ViewAction
參數而且按照提供的順序執行這些actions
。
// 在一個EditText中輸入文本信息,而後關閉軟鍵盤 onView(withId(R.id.editTextUserInput)) .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); // 按下按鈕來提交改變的文本 onView(withId(R.id.changeTextBt)).perform(click());
在Android設備上測試可能因爲時間的關係會隨機性地失敗。這個測試問題稱爲test flakiness(測試片狀)。在Espresso以前,變通的辦法是在測試中插入足夠長的睡眠或者一段時間後超時,或者增長在操做失敗以後保持重試的代碼。Espresso測試框架會在Instrumentation
和UI線程之間保持同步;這樣就能夠去掉以前由於時間問題使用的變通的方法,而且確保你測試的行爲和斷言運行更加可靠。
更多Espresso的相關學習,見 API reference 和 針對單個App的UI測試 練習。
UI Automator測試框架提供了一系列的API來構建在用戶app和系統app之間的UI測試。UI Automator APIs 容許你在測試設備中執行例如打開設置菜單或者launcher等操做。UI Automator 測試框架很是適合用來寫黑盒測試,其中測試代碼的編寫不須要依賴於目標app的內部實現細節。
UI Automator測試框架的關鍵特性包括:
檢查layout層次結構的Viewer。更多信息,見 UI Automator Viewer
。
一個用於在目標設備上獲取狀態信息和執行操做的API。更多信息,見 訪問設備狀態
跨app的UI測試APIs。更多信息,見 UI automator APIS
須要 Android4.3(API level 18) 或者更高。
uiautomatorviewer
工具提供了一個方便的GUI來掃描和分析當前在Android設備上顯示的UI組件。你可使用這些工具來檢查layout層次結構和查看在設備前臺可見的組件的屬性。這個信息可讓你使用UI Automator建立更加細粒度的測試,好比建立一個匹配指定的可見性屬性的UI選擇器。
uiautomatorviewer
工具在 <android-sdk>/tools/
目錄下。
UI Automator測試框架提供了一個 UIDevice
類在目標app運行的設備上訪問和執行操做。你能夠調用它的方法來訪問如當前的設備定向活着顯示尺寸等設備屬性。 UIDevice
類也可讓你執行一些以下的行爲:
旋轉設備
按下 D-pad
鍵
按下返回鍵、Home鍵、菜單鍵
打開通知欄
當前的窗口截圖
舉個例子,模擬按下Home按鈕,調用 UiDevice.pressHome()
方法。
UI Automator APIs 容許你在不須要知道目標app實現細節的狀況下去編寫強大的測試。你可使用這些APIs來捕獲和操做跨越多個app的UI組件:
UiCollection
:枚舉容器中的UI元素來計數,或者經過子元素的可見text或content-description
屬性來做爲一個目標。
UiObject
:表明在設備上一個可見的UI元素。
UiScrollable
:對可滾動的UI容器中搜索UI元素提供支持。
UiSelector
:表明一個設備上對一個或者多個目標UI元素的查詢。
Configurator
:容許你設置UI Automator測試的關鍵參數。
舉個例子,下面的代碼展現了怎麼樣去編寫一個測試腳原本獲取默認的app launcher:
// 初始化 UiDevice 實例 mDevice = UiDevice.getInstance(getInstrumentation()); // 在 HOME 按鈕上執行一個短暫的按壓 mDevice().pressHome(); // 經過匹配啓動按鈕的content-description來搜索一個UI組件 // 獲得默認的launcher UiObject allAppsButton = mDevice .findObject(new UiSelector().description("Apps")); // 在獲得的launcher 按鈕上面執行一個點擊 allAppsButton.clickAndWaitForNewWindow();
更多UI Automator相關學習,見 API reference 和 多App的UI測試 練習。
Android Testing Support Library package已經包含在最新版本的做爲補充庫、可在SDK Manager中下載的Android Support Repository中。
經過SDK Manager下載Android Support Repository:
在SDK Manager窗口,滾動到Packages列表的最底部,找到Extras
目錄,若是須要,把它展開顯示它的內容。
找到 Android Support Repository 項。
點擊 Install packages... 按鈕。
下載完以後,工具把Support Repository文件安裝在存在的Android SDK目錄。庫文件會被放置在你SDK目錄的子目錄中:<sdk>/extras/android/m2respository
目錄。
Android Testing Support Library 類被放置在android.support.test
包下面。
爲了在你的Gradle項目中使用Android Testing Support Library,在你的build.gradle
文件中增長以下依賴:
dependencies { androidTestCompile 'com.android.support.test:runner:0.4' // Set this dependency to use JUnit 4 rules androidTestCompile 'com.android.support.test:rules:0.4' // Set this dependency to build and run Espresso tests androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' // Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' }
爲了在你的Gradle項目中默認使用AndroidJUnitRunner做爲默認的instrumentation runner,在你的build.gradle
文件中指定這個依賴:
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
強烈推薦你與Android Studio IDE一塊兒使用Android Testing Support Library。Android Studio提供了支持測試開發的功能,好比:
靈活並基於Gradle構建系統,支持對你測試代碼的依賴管理。
單元和instrumented測試代碼與你的app的源代碼放置在單個項目結構中。
支持從命令行或者GUI來部署和運行你的測試在虛擬或者物理設備中。
更多Android Studio相關和下載,見 下載Android Studio和SDK Tools。