测试环境搭建:配置 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. 整个环境搭建流程
为了让你看得更清楚,我画了一张流程图。它从项目配置开始,到依赖添加、框架启用、创建测试类,最后运行测试——一步到位。
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 依赖版本必须一致