天天看點

【單元測試】Android Espresso 使用解析(3.1.0 版本)1 簡介2 依賴3 Espresso API4 Espresso 正常使用5、參考文獻

文章目錄

  • 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 開發者文檔