文章目錄
- 1 簡介
- 2 依賴
-
- 2.1 設定測試環境
- 2.2 添加 Espresso 依賴項
- 2.3 設定插樁測試運作程式
- 2.4 關閉收集分析資料
- 2.5 Gradle 指令行運作
- 3 Espresso API
- 4 Espresso 正常使用
-
- 4.1 查找視圖
- 4.2 對視圖執行操作
- 4.3 檢查視圖斷言
- 4.4 點選按鈕
- 4.5 驗證 TextView 文本
- 4.6 斷言視圖未顯示
- 4.7 斷言視圖不存在
- 4.8 自定義故障處理程式
- 5、參考文獻
1 簡介
-
是Espresso
推出來的一款提供給Google
進行Android
自動化測試的架構,其目标使用者主要是針對開發人員。UI
2 依賴
2.1 設定測試環境
- 為了避免測試不穩定,我們強烈建議您在用于測試的虛拟或實體裝置上關閉系統動畫。在您的裝置上,在設定 > 開發者選項下,停用以下三項設定:
- (1)視窗動畫縮放;
- (2)過渡動畫縮放;
- (3)
時長縮放。Animator
2.2 添加 Espresso 依賴項
// app/build.gradle
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// 測試選項
testOptions {
unitTests {
includeAndroidResources=true
}
}
}
dependencies {
def espresso_version = "3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-web:$espresso_version"
androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-idling-resource:$espresso_version"
}
2.3 設定插樁測試運作程式
// app/build.gradle
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
2.4 關閉收集分析資料
-
為了確定每個新版本都在正确的軌道上,測試運作程式會收集分析資料。更具體地說,它會針對每次調用上傳被測應用的軟體包名稱的哈希值,這樣就可以使用Espresso
來衡量獨特軟體包數以及使用量。Espresso
- 如果不希望上傳此資料,則可以通過在插樁測試指令中添加
參數來停用此功能:disableAnalytics
adb shell am instrument -e disableAnalytics true
2.5 Gradle 指令行運作
3 Espresso API
-
:用于與視圖互動(通過Espresso
和onView()
)的入口點。此外,還公開不一定與任何視圖相關聯的onData()
,如API
。pressBack()
-
:可以傳遞給ViewActions
方法的ViewInteraction.perform()
對象的集合,例如ViewAction
。click()
-
:與DataInteraction
中顯示的資料進行互動的接口。AdapterViews
-
:RecyclerViewActions
與ViewAction
互動的接口。RecyclerView
-
:實作ViewMatchers
接口的對象的集合。您可以将其中一個或多個對象傳遞給Matcher<? super View>
方法,以在目前視圖層次結構中找到某個視圖。onView()
-
:可以通過ViewAssertions
方法傳遞的ViewInteraction.check()
對象的集合。在大多數情況下,您将使用ViewAssertion
斷言,它使用視圖比對器斷言目前標明視圖的狀态。matches
-
:提供對視圖執行操作或斷言的主要接口。ViewInteraction
-
:與ViewMatchers
比對的View
比對器的集合。hamcrest
- 更詳細的 API 描述請點選此檢視
4 Espresso 正常使用
4.1 查找視圖
-
允許您使用現有的Espresso
對象或您自己的自定義對象來縮小視圖範圍。ViewMatcher
// R.id 唯一
onView(withId(R.id.xxx))
// R.id 不唯一
onView(allOf(withId(R.id.xxx), withText("Hello")))
4.2 對視圖執行操作
- 找到适合目标視圖的比對器後,可以使用
方法對該視圖執行perform
執行個體。ViewAction
// 一次 perform 調用來執行單項操作
onView(...).perform(click())
// 一次 perform 調用來執行多項操作
onView(...).perform(typeText("Hello"), click())
4.3 檢查視圖斷言
// 檢查視圖是否包含文本 "Hello!"
onView(...).check(matches(withText("Hello!")))
4.4 點選按鈕
// 執行某個按鈕的點選
onView(withId(R.id.xxx)).perform(click())
4.5 驗證 TextView 文本
// 驗證 TestView 文本内容
onView(withId(R.id.xxx)).check(matches(withText("Hello Espresso!")))
4.6 斷言視圖未顯示
4.7 斷言視圖不存在
4.8 自定義故障處理程式
- 将
中的預設Espresso
替換為自定義故障處理程式後,可以進行其他或不同的錯誤處理,如截取螢幕截圖或傳遞額外的調試資訊。FailureHandler
private class CustomFailureHandler(targetContext: Context): FailureHandler {
private val delegate: FailureHandler
init {
delegate = DefaultFailureHandler(targetContext)
}
override fun handle(error: Throwable, viewMatcher: Matcher<View>) {
try {
delegate.handle(error, viewMatcher)
} catch (e: NoMatchingViewException) {
throw MySpecialException(e)
}
}
private class MySpecialException(cause: Throwable?): java.lang.RuntimeException(cause)
}
- 此故障處理程式抛出
而不是MySpecialException
,并将其他所有故障的處理委托給NoMatchingViewException
。您可以在測試的DefaultFailureHandler
方法中向setUp()
注冊Espresso
:CustomFailureHandler
@Throws(Exception::class)
override fun setUp() {
super.setUp()
getActivity()
setFailureHandler(CustomFailureHandler(ApplicationProvider.getApplicationContext<Context>()))
}
5、參考文獻
- Android Espresso 開發者文檔