以下內容為原創,歡迎轉載,轉載請注明
來自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html
翻譯自 Android Developer 官網:http://developer.android.com/tools/testing-support-library/index.html
Testing Support Library
Android Testing Support Library
為Android app的測試提供了一個廣泛的框架。 這個庫提供了一系列的API可以讓你快速build和run你app的代碼,它包括了JUnit 4
和功能性的用戶界面(UI)測試。你可以通過Android Studio IDE或者命令行的方式運行你使用這些API創建的測試。
Android Testing Support Library
已經可以通過Android SDK Manager
下載使用了。詳情可見Testing Support Library Setup
這頁中會提供一些關於Android Testing Support Library
中所提供的工具的信息,怎樣在你的測試環境中使用它們,還有庫發布的相關信息。
Testing Support Library的特性
Android Testing Support Library
提供包括了以下自動化測試工具:
-
AndroidJUnitRunner:兼容Android的JUnit 4。
-
Espresso:UI測試框架,適用於app內的功能性UI測試。
-
UI Automator:UI測試框架,適用於系統和安裝app間跨app的功能性UI測試。
AndroidJUnitRunner
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) 或者更高。
JUnit的支持
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();
}
}
訪問instrumentation信息
你可以使用 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
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) 或者更高。
View 匹配
Espresso.onView()
方法可以讓你訪問目標app中的一個UI組件並與它交互。這個方法接收一個 Matcher
作為參數,然后根據我們給定的條件在view的層次結構中搜索出對應相符的View
實例。你可以使用如下的條件來優化你的搜索結果:
- View的類名
- View內容的描述(
content description
) - View的
R.id
- View顯示的文本
舉個例子,尋找一個ID為my_button
的目標button,你可以如以下一樣指定一個matcher:
onView(withId(R.id.my_button));
如果搜索是成功的,onView()
方法會返回一個可以讓你執行用戶行為和測試目標中對view斷言的引用。
Adapter 匹配
在一個 AdapterView
的布局中,布局是在運行時根據children動態填充的。如果目標view是在 AdapterView
子類(比如ListView
或者 GridView
)的布局中的,onView()
方法可能就不起作用了,因為當前加載的view層次結構可能只是layout的一個子集。
替代方案是使用 [Espresso.onData()
] 方法去訪問一個目標view元素。[Espresso.onData()
] 方法返回一個可以讓你執行用戶行為和測試目標 AdapterView
中對元素斷言的引用。
行為 APIs
典型的,你可以通過對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());
UI線程同步
在Android設備上測試可能由於時間的關系會隨機性地失敗。這個測試問題稱為test flakiness(測試片狀)。在Espresso之前,變通的辦法是在測試中插入足夠長的睡眠或者一段時間后超時,或者增加在操作失敗之后保持重試的代碼。Espresso測試框架會在Instrumentation
和UI線程之間保持同步;這樣就可以去掉之前因為時間問題使用的變通的方法,並且確保你測試的行為和斷言運行更加可靠。
更多Espresso的相關學習,見 API reference 和 針對單個App的UI測試 練習。
UI Automator
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) 或者更高。
UI Automator Viewer
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
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測試 練習。
Testing Support Library Setup
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。
[Espresso.onData()
]: http://developer.android.com/reference/android/support/test/espresso/Espresso.html#onData)
[UIDevice
]: http://developer.android.com/reference/android/support/test/uiautomator/UiDevice.html