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 库。

要点: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")
}
注意:请勿同时混用 Material 2 和 Material 3 的进度指示器类,否则会出现类冲突。如果项目已有 Material 2,请通过 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: ComposeViewCompose BOM 与 Material 3 版本不匹配统一使用 BOM 版本,删除单独版本号
WorkManager 初始化失败缺少 work-testing 或未调用 initializeTestWorkManager检查依赖,确保 @Before 正确执行
模拟器上进度条不更新模拟器未开启后台权限或 API 级别过低按 1.2 节配置模拟器,并使用 API 26+ 镜像
快速检查:在模拟器通知栏观察 WorkManager 的调度日志 adb logcat -s WM-*,确认任务已排队且未因电池优化被取消。

1.6 环境搭建流程图

下图展示从 Android Studio 创建工程到可运行测试的完整流程:

测试环境搭建工作流 测试环境搭建流程图 创建 Compose 工程 添加 Material 3 + WorkManager 启动模拟器 API 34 创建 ProgressBackgroundTest 运行 connectedAndroidTest 检查 logcat 与进度数值 💡 每完成一个节点建议执行一次 ./gradlew :app:assembleDebug 确保无编译错误

流程图中的每个环节都对应本节的详细步骤。创建工程时务必选择“Empty Compose Activity”模板以自动适配 Compose 构建;依赖添加后同步 Gradle 并留意版本冲突;模拟器配置完成后通过 adb shell dumpsys deviceidle disable 强制关闭 idle 模式以加速测试。