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
)时。