Robolectric 策略

Robolectric 是由 Google 維護的開放原始碼架構,可讓您在 JVM 內的模擬 Android 環境中執行測試,而不會受到模擬器的額外負擔和不穩定性影響。自 Lollipop (API 級別 21) 起,此 API 支援所有 Android 版本。

許多大型專案都會使用 Robolectric 來提高測試速度和可靠性,並減少在實際裝置或模擬器上執行測試的相關費用。包括大多數仰賴 Robolectric 的 Google 應用程式。

Robolectric 無法完全取代模擬器,因為它不支援所有功能和 API。舉例來說,Robolectric 沒有模擬器的畫面,且部分 API 僅部分支援。不過,它模擬了足夠的 Android 部分,可可靠地執行單元測試和大部分的 UI 測試。

測試策略

您可以透過 Robolectric 採用兩種測試策略:單元測試和 UI 測試。

單元測試

Robolectric 的構想是為了在 Android 應用程式中啟用「單元測試」。舉例來說,您可以模擬活動的啟動作業,並呼叫所有生命週期方法,以便測試活動中的邏輯。

您也可以使用 Robolectric 的假資料 (稱為陰影) 做為單元測試的依附元件。例如,如果您的類別使用 Bundle,或是需要模擬 Bluetooth 連線。

一般來說,如果您實作可測試的架構,就不需要使用 Robolectric 進行單元測試,因為您的程式碼應可獨立測試,且不依附於 Android 架構。

UI 測試

Robolectric 也能執行 UI 測試,例如 Espresso 或 Compose 測試。您可以將檢測設備測試移至 test 來源集,並設定 Robolectric 依附元件,藉此將測試轉換為 Robolectric。

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

test 來源集中的任何 UI 測試都會搭配 Robolectric 執行。

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

大多數 UI 測試不會與架構互動,因此您可以在 Robolectric 上執行這些測試。您可以在 Robolectric 上執行行為測試,因為所需的準確度已足夠。例如,當 Compose 測試驗證點按按鈕後,使用者介面是否已變更。

您可以使用 Robolectric 執行其他 UI 測試,例如螢幕截圖測試。不過,由於不同裝置的螢幕顯示方式略有差異,因此精確度會降低。

您必須決定 Robolectric 的導入方式是否適合每個用途,但以下提供一些建議:

  • 使用 Robolectric 進行元件、功能或應用程式測試的 UI 行為隔離測試。一般來說,這些測試會檢查 UI 的狀態管理和行為,且不會與外部相依項目互動。
  • 當像素精確度不重要時,請使用 Robolectric 擷取螢幕截圖。例如,測試元件如何回應不同的字型大小或主題。

注意:Robolectric 可以原生擷取螢幕畫面,但您需要使用第三方程式庫,才能透過該程式庫執行螢幕畫面測試。

Robolectric 與裝置測試

總而言之,Robolectric 提供足夠的準確度,可執行大多數 UI 測試,但某些情況仍需要進行裝置測試,例如與系統 UI 相關的測試 (例如邊到邊或子母畫面),或是需要使用 WebView 等不支援的功能。