Robolectric 策略

Robolectric 是一个由 Google 维护的开源框架,它允许您在 JVM 内的模拟 Android 环境中运行测试,而无需模拟器的开销和不稳定性。它支持从 Lollipop(API 级别 21)开始的所有 Android 版本。

许多大型项目使用 Robolectric 来提高测试速度和可靠性,并降低在真实设备或模拟器上运行测试相关的成本。这包括大多数严重依赖 Robolectric 的 Google 应用。

Robolectric 并不是模拟器的完整替代品,因为它不支持所有功能和 API。例如,Robolectric 没有像模拟器那样的屏幕,并且某些 API 仅部分受支持。但是,它模拟了 Android 的足够部分以可靠地运行单元测试和大多数 UI 测试。

测试策略

您可以使用 Robolectric 采用两种类型的测试策略:单元测试和 UI 测试。

单元测试

Robolectric 的构想是为了在 Android 应用中启用“单元测试”。例如,您可以模拟 Activity 的启动并测试其中的逻辑,调用所有生命周期方法。

您还可以使用 Robolectric 的模拟对象(称为影子)作为单元测试的依赖项。例如,如果您的类使用 Bundle 或您需要模拟 蓝牙 连接。

通常,如果您实现 可测试的架构,则无需使用 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 测试验证在单击按钮后 UI 是否已更改时。

您可以使用 Robolectric 运行其他 UI 测试,例如屏幕截图测试。但是,保真度较低,因为不同的设备会略微不同地呈现屏幕。

您必须确定 Robolectric 的实现是否足以满足每个用例,但以下是一些建议

  • 将 Robolectric 用于组件、功能或应用测试的隔离 UI 行为测试。通常,这些测试检查 UI 的状态管理和行为,并且不与外部依赖项交互。
  • 当像素精度不重要时,使用 Robolectric 拍摄屏幕截图。例如,测试组件如何对不同的字体大小或主题做出反应。

注意:Robolectric 可以原生拍摄屏幕截图,但您需要第三方库才能使用它执行屏幕截图测试。

Robolectric 与设备测试

总之,Robolectric 提供了足够高的保真度来运行大多数 UI 测试,但在某些情况下仍然需要设备测试,例如与系统 UI(如边缘到边缘或画中画)相关的测试,或依赖于不受支持的功能(如 WebView)时。