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
等不支援的功能。