后台任务触发Compose刷新Espresso实战 - 第1节

1.1 课程全景:后台任务与 Compose 刷新的测试闭环

本课程共 30 章,围绕“后台任务触发 → Compose 状态更新 → UI 刷新 → Espresso 验证”这一核心链路展开。章节按四阶段组织:基础篇(1–7 章)搭建工程与测试基础设施;实战篇(8–18 章)实现具体后台任务场景的 Compose 刷新与测试;优化篇(19–25 章)处理异步、竞态、内存泄漏和稳定性;总结篇(26–30 章)输出最佳实践与可复用模板。

阶段 章节 核心产出
基础篇 1–7 项目初始化、Compose 测试库引入、ViewModel+State 绑定、WorkManager 后台任务、Coroutine 测试
实战篇 8–18 定时刷新、网络轮询、本地数据库变更、WorkManager 链式任务触发 UI 更新、多状态叠加测试
优化篇 19–25 IdlingResource 与 Compose 同步、线程安全、内存泄漏检测、Flaky 测试治理、性能基线
总结篇 26–30 项目模板、CI/CD 集成、覆盖率门禁、常见错误速查表、课程知识图谱

1.2 工程初始化:Gradle 与 Compose 测试库配置

所有实战案例均基于 Android Gradle Plugin 8.x 与 Kotlin 1.9.x 构建。Compose BOM 统一版本管理,测试依赖显式声明。

1.2.1 根项目 build.gradle

buildscript {
    ext {
        agp_version = '8.2.0'
        kotlin_version = '1.9.22'
        compose_bom = '2024.02.00'
        compose_compiler = '1.5.9'
        espresso_version = '3.5.1'
        test_runner_version = '1.5.2'
        work_manager_version = '2.9.0'
    }
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$agp_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

1.2.2 模块级 app/build.gradle 测试相关片段

android {
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    // Compose BOM
    implementation platform("androidx.compose:compose-bom:$compose_bom")
    implementation "androidx.compose.ui:ui"
    implementation "androidx.compose.material3:material3"
    implementation "androidx.compose.runtime:runtime"

    // Compose 测试
    androidTestImplementation platform("androidx.compose:compose-bom:$compose_bom")
    androidTestImplementation "androidx.compose.ui:ui-test-junit4"

    // Espresso 基础
    androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
    androidTestImplementation "androidx.test.espresso:espresso-contrib:$espresso_version"

    // Test Runner
    androidTestImplementation "androidx.test:runner:$test_runner_version"
    androidTestImplementation "androidx.test:rules:$test_runner_version"

    // WorkManager 测试
    androidTestImplementation "androidx.work:work-testing:$work_manager_version"
}
版本兼容性提示:Compose BOM 和 Compose Compiler 必须严格匹配 Kotlin 版本。推荐使用 官方兼容表 确认对应关系。本课程使用 Kotlin 1.9.22 + Compose Compiler 1.5.9。

1.3 Compose 测试库引入:核心依赖解析

依赖项 作用域 作用
ui-test-junit4 androidTest 提供 createComposeRule()、ComposeTestRule,用于设置 Compose 内容并执行 UI 操作/断言
espresso-core androidTest 基础 View 匹配、操作和等待机制,与 Compose 测试形成互补
espresso-contrib androidTest 包含 IdlingRegistry、CountingIdlingResource,用于后台任务同步
work-testing androidTest 提供 TestListenableWorkerBuilder、WorkManagerTestInitHelper,模拟 WorkManager 执行
runner / rules androidTest JUnit 4 测试运行器与 ActivityScenarioRule 等规则

1.4 项目结构模板与 Test Runner

1.4.1 推荐目录结构

app/
├── src/
│   ├── main/java/com/example/backgroundrefresh/
│   │   ├── data/
│   │   │   └── repository/         // 数据源 & 后台任务触发
│   │   ├── ui/
│   │   │   └── screen/            // Compose 页面 & ViewModel
│   │   ├── worker/
│   │   │   └── RefreshWorker.kt   // WorkManager Worker
│   │   ├── MainActivity.kt
│   │   └── MainApplication.kt
│   ├── test/java/...              // 单元测试(非 UI)
│   └── androidTest/java/...      // 插桩测试(UI + 后台)
│       └── RefreshUIScreenTest.kt

1.4.2 基础测试类模板

package com.example.backgroundrefresh

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
@LargeTest
class RefreshUIScreenTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun backgroundTaskTriggersComposeRefresh() {
        // 设置 Compose 内容
        composeTestRule.setContent {
            RefreshScreen(viewModel = fakeViewModel())
        }
        // 后续章节将在此处编写后台任务触发与 UI 断言逻辑
    }
}
第 1 章 · 工程初始化 & 依赖架构 build.gradle AGP 8.2 · Kotlin 1.9.22 Compose BOM 2024.02 App Module Compose UI + ViewModel 后台任务 (WorkManager) androidTest ComposeTestRule Espresso + IdlingResource work-testing TestListenableWorkerBuilder Espresso IdlingResource CountingIdlingResource 后台任务触发 Compose 刷新测试流程 Worker/Coroutine 更新 State → Compose 重组 Espresso 通过 IdlingResource 等待异步完成 → 验证效果 红色箭头表示 Gradle 依赖传递方向,箭头标记 marker 定义如下
常见错误:若 ui-test-junit4 与 espresso-core 版本不兼容(如 Compose BOM 2024.02 与 Espresso 3.4.0 混用),可能导致 NoClassDefFoundError 或 TestRule 无法注入。始终通过 BOM 统一 Compose 相关版本,且确保 espresso-core 与 androidx.test 版本对应。