3. AndroidX Test库核心组件:InstrumentationRegistry、ActivityScenario、FragmentScenario、测试环境搭建
3.1 组件架构与原理
AndroidX Test库位于 androidx.test 包下,是 Google 官方提供的 Android 测试基础设施。其核心设计理念是通过一套标准化 API,让开发者在接近真实环境的条件下编写可复用、可验证的 UI 组件测试。本章聚焦三个核心组件,它们构成了 Android 组件测试的“铁三角”:
- InstrumentationRegistry — 测试环境的“护照”,提供访问 Instrumentation、Context 等底层资源的通道。
- ActivityScenario — Activity 测试的“遥控器”,精确控制 Activity 生命周期状态。
- FragmentScenario — Fragment 测试的“培养皿”,在隔离或附加模式下验证 Fragment 行为。
三者的协作关系可概括为:InstrumentationRegistry 提供测试环境上下文,ActivityScenario 和 FragmentScenario 基于该环境操控 UI 组件,最终验证被测应用的行为与状态。
| 组件 | 用途 | 核心方法 | 适用场景 |
|---|---|---|---|
| InstrumentationRegistry | 获取测试环境上下文 | getInstrumentation()、getContext()、getTargetContext() | 需要 Context 或 Instrumentation 的底层测试 |
| ActivityScenario | 控制 Activity 生命周期 | launch()、moveToState()、onActivity()、recreate() | Activity 集成测试、生命周期验证 |
| FragmentScenario | 控制 Fragment 生命周期 | launchInContainer()、launch()、moveToState()、onFragment() | Fragment 独立测试、视图绑定验证 |
三个组件均不依赖第三方模拟框架,直接使用 AndroidX Test 运行时库即可在真实设备或模拟器上执行,保证测试结果与生产环境行为一致。
3.2 InstrumentationRegistry:测试桥梁
原理:InstrumentationRegistry 是一个静态工具类,通过 JVM 静态变量机制在测试进程启动时注入 Instrumentation 实例。测试代码无需手动初始化,即可获取以下关键对象:
getInstrumentation()— 返回当前测试进程的 Instrumentation 对象,可用于模拟按键、触控事件或获取系统服务。getContext()— 返回测试应用自身的 Context,通常用于读取测试专属资源。getTargetContext()— 返回被测应用的 Context,是操作应用数据、SharedPreferences、数据库的入口。
典型用法:获取被测应用的 SharedPreferences
@Test
public void testSharedPreferencesWrite() {
Context targetContext = InstrumentationRegistry.getTargetContext();
SharedPreferences prefs = targetContext.getSharedPreferences("app_prefs", Context.MODE_PRIVATE);
prefs.edit().putString("theme", "dark").apply();
String theme = prefs.getString("theme", "light");
assertEquals("dark", theme);
}
InstrumentationRegistry 的所有 get 方法都可在
@Before 或 @Test 中直接调用,无需额外注入;但不要在静态初始化块中调用,因为此时 Instrumentation 尚未就绪。3.3 ActivityScenario:Activity 生命周期测试
原理:ActivityScenario 通过反射创建 Activity 实例,并自动管理其生命周期状态机。状态迁移路径为:CREATED → STARTED → RESUM