测试环境搭建:配置 build.gradle 依赖,启用测试框架,创建测试类

搭建 Compose UI Test 的测试环境,说白了就是把必要的依赖、测试框架和测试类这「三件套」准备好。我刚开始写 Compose 测试时,总觉得配置依赖是小事,结果经常因为版本冲突或者 Runner 没配对,浪费大把时间在「为啥测试跑不起来」上面。嗯,这一章我们就一次搞定它。

1. 配置 build.gradle 依赖

工欲善其事,必先利其器。Compose UI Test 的依赖主要集中在模块级的 build.gradle 里。我个人习惯把它们放在一个统一的测试依赖块中,方便管理和升级。

第一步:确认项目级 build.gradle

确保你用的 Kotlin 和 Compose 编译器版本是匹配的。我遇到过好几次因为 kotlin 版本太低导致 Compose 测试 API 无法编译——血的教训。

// 项目级 build.gradle (以 Kotlin DSL 为例)
plugins {
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
    id("com.android.application") version "8.2.0" apply false
    // ...
}

第二步:模块级 build.gradle 添加依赖

这里是最关键的。我把常用依赖整理成了表格,你直接复制粘贴就好。

依赖名称 作用 推荐版本(2025年稳定)
androidx.compose.ui:ui-test-junit4 提供 createComposeRule() 和 Compose 测试注解 1.7.0
androidx.compose.ui:ui-test-manifest 允许测试时创建自定义 Activity(可选但推荐) 1.7.0
androidx.test.ext:junit JUnit4 扩展(兼容 AndroidX Test) 1.2.1
androidx.test.espresso:espresso-core 用于与 View 系统交互(Compose 测试可能也用得到) 3.6.1
debugImplementation 作用域 表示只在 debug 构建类型下打包测试依赖 —
// app/build.gradle
android {
    defaultConfig {
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    // Compose UI Test
    debugImplementation("androidx.compose.ui:ui-test-junit4:1.7.0")
    debugImplementation("androidx.compose.ui:ui-test-manifest:1.7.0")
    // 测试框架核心
    androidTestImplementation("androidx.test.ext:junit:1.2.1")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
    // 可选:如果需要 Mock 或断言库
    androidTestImplementation("org.mockito:mockito-android:5.14.2")
}

⭐ 重要:依赖版本对齐

所有 Compose 相关的依赖(ui-test-junit4、ui-test-manifest、ui、material3 等)必须使用同一大版本。比如都用 1.7.x,否则运行时会出现 NoClassDefFoundError。我曾经因为把测试依赖的 Compose 版本写成了 1.6.0,而主工程用了 1.7.0,结果 `ComposeTestRule` 无法创建——浪费了整整半天。

2. 启用测试框架

依赖加好了,还得告诉 Android 测试框架用哪个 Runner。默认情况下,只要你在 defaultConfig 里写了:

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

就够了。如果你用的 JUnit5,需要额外配置,但 Compose 官方推荐使用 JUnit4,因为 ui-test-junit4 库就是基于 JUnit4 构建的。你想想看,如果硬要混用 JUnit5,可能会遇到注解冲突的问题。我建议:刚开始学 Compose UI Test 时,老老实实走 JUnit4 路线。

另外需要注意: 要在测试设备上运行,必须确保 debuggable true(默认 debug 构建就是 true)。如果你用 release 构建跑测试,记得在 buildTypes 里显式设置 testCoverageEnabled 和 debuggable。

💡 一个小技巧

如果你希望测试类能自动创建 Activity,而不需要手动 ActivityScenario.launch(),可以使用 @get:Rule 配合 AndroidComposeTestRule。这个我们会在第3章详细讲,但记得在 ui-test-manifest 依赖已添加的前提下才能用。

3. 创建测试类

现在万事俱备,我们来写第一个 Compose UI 测试类。测试类通常放在 src/androidTest/java/ 目录下(注意是 androidTest,不是 test)。

package com.example.myapp

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

@RunWith(AndroidJUnit4::class)
class GreetingTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun testGreetingDisplaysCorrectText() {
        // 设置 Compose 内容
        composeTestRule.setContent {
            Greeting("World")
        }

        // 断言文本 "Hello World!" 可见
        composeTestRule.onNodeWithText("Hello World!").assertExists()
    }
}

简单解释一下:

  • @RunWith(AndroidJUnit4::class) 告诉测试框架使用 AndroidX 的 runner。
  • @get:Rule val composeTestRule = createComposeRule() 是 Compose 测试的核心,它会为你管理一个 Compose 容器。
  • setContent 让你把 Composable 塞进去。
  • 后面的断言(比如 onNodeWithText)我们第4章会深入讲。

⚠️ 注意:测试类的位置

如果你不小心把测试类放在了 src/test/java/(单元测试目录),运行时会报 Instrumentation run failed,因为 createComposeRule 需要 Android 环境。我就犯过这个低级错误,还好同事一眼发现了。

4. 整个环境搭建流程

为了让你看得更清楚,我画了一张流程图。它从项目配置开始,到依赖添加、框架启用、创建测试类,最后运行测试——一步到位。

Compose UI Test 环境搭建流程 项目级 build.gradle 模块级 build.gradle 添加 ui-test-junit4 等依赖 启用测试框架 AndroidJUnitRunner 创建测试类 @RunWith + @Rule 运行测试 在模拟器/真机上执行 所有配置必须在 androidTest 目录下生效

5. 验证环境

写完测试类别急着写业务代码,先跑一下看看环境通不通。在 Android Studio 中右键测试类选择「Run」即可。如果看到 Tests passed,恭喜你,环境搭好了!

如果遇到 No tests found,检查:

  • 测试类是否在 androidTest 目录下
  • build.gradle 里是否漏了 testInstrumentationRunner
  • 依赖是否使用了 debugImplementation 而不是 implementation

📌 核心要点回顾

  • 依赖三个核心:ui-test-junit4、ui-test-manifest、ext-junit
  • 启用 Runner:testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  • 测试类用 @RunWith(AndroidJUnit4::class) 和 @get:Rule createComposeRule()
  • 所有 Compose 依赖版本必须一致