1. 测试环境搭建
后台任务更新 Material 3 进度控件的 UI 测试需要稳定的隔离环境。本章围绕 Android 模拟器配置、Material 3 依赖库引入以及测试工程创建三个步骤,搭建可复现的测试基底。所有命令和配置均基于 Android Studio 2023.3+ 及 Gradle 8.x 验证。
1.1 测试原理简述
后台任务(如 WorkManager、Foreground Service)更新 UI 时,测试需要确保:
- 进度回调被正确发送到主线程
- Material 3 的
LinearProgressIndicator或CircularProgressIndicator的进度值随任务状态同步变化 - 模拟器时间加速与真实设备行为一致
环境搭建的关键在于:模拟器 API 级别 ≥ 26(支持 WorkManager)、启用后台执行权限、测试工程正确引用 Compose Material 3 库。
androidx.compose.material3 库,并且测试需使用 @ComposeTestRule 等待异步状态。
1.2 Android 模拟器配置
推荐使用 API 33 或 API 34 的 Pixel 6 Pro 模拟器,内存 2 GB 以上,启用“后台进程限制为无限制”:
# 通过命令行创建模拟器(示例 API 34, x86_64)
avdmanager create avd -n test_progress -k "system-images;android-34;google_apis;x86_64" -d pixel_6_pro
# 启动模拟器,同时跳过锁屏并允许后台执行
emulator -avd test_progress -no-snapshot -wipe-data -netdelay none -netspeed full
在模拟器设置中手动关闭“后台检查”和“电池优化”以模拟不受限环境:
| 设置项 | 操作路径 | 目的 |
|---|---|---|
| 后台检查 | 设置 → 应用 → 特殊权限 → 后台检查 → 选择测试应用 → 不限制 | 避免后台任务被系统冻结 |
| 电池优化 | 设置 → 应用 → 特殊权限 → 电池优化 → 选择测试应用 → 不优化 | 防止后台调度延迟 |
| 开发者选项 | 设置 → 系统 → 开发者选项 → 后台进程限制 → 标准限制或最多 4 个进程 | 确保多后台任务共存 |
1.3 Material 3 依赖库引入
在模块级 build.gradle.kts 中添加以下依赖(版本号请同步 Compose BOM 2024.10.00 或更高):
dependencies {
// Compose BOM
val composeBom = platform("androidx.compose:compose-bom:2024.10.00")
implementation(composeBom)
androidTestImplementation(composeBom)
// Material 3 核心库(包含进度指示器)
implementation("androidx.compose.material3:material3")
// 可选:Material 3 扩展(如进度条动画)
implementation("androidx.compose.material3:material3-window-size-class")
// WorkManager 用于后台任务
implementation("androidx.work:work-runtime-ktx:2.9.1")
// 测试 WorkManager
androidTestImplementation("androidx.work:work-testing:2.9.1")
// Compose UI 测试支持
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-test-manifest")
}
implementation("androidx.compose.material:material") 单独控制范围。
1.4 测试工程创建
使用 Android Studio 新建项目模板,选择“Empty Compose Activity”。在 src/androidTest 目录下创建测试类,目录结构如下:
app/src
├── main/java/com/example/progressdemo/
│ └── MainActivity.kt, DemoViewModel.kt
└── androidTest/java/com/example/progressdemo/
└── ProgressBackgroundTest.kt
测试类需要标记 @RunWith(AndroidJUnit4::class) 并注入 @get:Rule 的 ComposeTestRule。同时添加 WorkManager 测试初始化:
@RunWith(AndroidJUnit4::class)
class ProgressBackgroundTest {
@get:Rule
val composeTestRule = createAndroidComposeRule()
@Before
fun setupWorkManager() {
val context = ApplicationProvider.getApplicationContext()
WorkManagerTestInitHelper.initializeTestWorkManager(context)
}
}
1.5 环境验证与常见错误
搭建完成后执行一次空测试,验证所有依赖正确加载:
# 在项目根目录运行验证测试
./gradlew :app:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.progressdemo.ProgressBackgroundTest
| 常见错误 | 原因 | 解决 |
|---|---|---|
| NoSuchMethodError: ComposeView | Compose BOM 与 Material 3 版本不匹配 | 统一使用 BOM 版本,删除单独版本号 |
| WorkManager 初始化失败 | 缺少 work-testing 或未调用 initializeTestWorkManager | 检查依赖,确保 @Before 正确执行 |
| 模拟器上进度条不更新 | 模拟器未开启后台权限或 API 级别过低 | 按 1.2 节配置模拟器,并使用 API 26+ 镜像 |
adb logcat -s WM-*,确认任务已排队且未因电池优化被取消。
1.6 环境搭建流程图
下图展示从 Android Studio 创建工程到可运行测试的完整流程:
流程图中的每个环节都对应本节的详细步骤。创建工程时务必选择“Empty Compose Activity”模板以自动适配 Compose 构建;依赖添加后同步 Gradle 并留意版本冲突;模拟器配置完成后通过 adb shell dumpsys deviceidle disable 强制关闭 idle 模式以加速测试。