🧪 单元测试基础概念 Compose 单元测试 · 从入门到实战

📚 第1章 · 基石 ✨ 中小学生色系 · 轻松入门

🔍 1. 什么是单元测试

单元测试 是针对程序中的最小可测试单元(函数、方法、或 Compose 中的 @Composable 组件) 进行正确性验证的自动化测试手段。在 Android Compose 世界中,一个 Composable 函数、一个 ViewModel 的逻辑、 一个状态计算函数,都可以作为“单元”来测试。

函数 (单元) Composable (单元) ViewModel (单元) ✓

单元测试通常由开发者编写,运行快速(毫秒级),且不依赖外部环境(网络、数据库、文件系统)。 在 Compose 中,我们可以使用 createComposeRule() 来测试 Composable 的渲染与交互。

💡 2. 为什么需要单元测试

  • 🛡️ 防止回归 —— 修改代码后快速验证原有功能是否被破坏。
  • 📖 活文档 —— 测试用例直观表达函数/组件的预期行为。
  • ⚡ 快速反馈 —— 秒级运行,CI/CD 中即时发现缺陷。
  • 🧩 提升设计 —— 可测试性倒逼代码解耦、依赖注入。
  • 🎯 节省成本 —— 越早发现 Bug,修复成本越低。
无测试 有测试 集成

在 Compose 项目中,UI 单元测试能直接验证组件状态、交互事件、文本显示等,极大提升界面稳定性。

⚖️ 3. 单元测试 vs 集成测试

维度 🧪 单元测试 🔗 集成测试
测试范围 单个函数 / Composable / 类 多个模块 / 组件协作
运行速度 极快 (毫秒级) 较慢 (秒级~分钟级)
依赖隔离 完全隔离 (mock / stub) 真实依赖或半隔离
故障定位 精准到单元 跨组件,定位稍复杂
维护成本 低 (聚焦单一职责) 中高 (环境搭建)
Compose 示例 测试 MyButton 点击后文本变化 测试导航 + 列表 + 详情页跳转

简单来说:单元测试保证“零件”合格,集成测试保证“组装”正常。 两者相辅相成,测试金字塔中单元测试占据最大比例(约 70%)。

📐 测试金字塔 · 经典模型

单元测试 (Composable / 逻辑) 集成测试 (模块交互) E2E / UI 自动化 (端到端)

🧑‍💻 实战预览 · Compose 单元测试

下面是一个极简的 Composable 单元测试示例(使用 createComposeRule):

@RunWith(AndroidJUnit4::class)
class GreetingTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun greeting_displaysCorrectText() {
        // 设置 Composable
        composeTestRule.setContent {
            Greeting(name = "小智")
        }

        // 验证文本是否存在
        composeTestRule
            .onNodeWithText("你好, 小智!")
            .assertExists()
    }
}

通过 onNodeWithText 查找组件,assertExists 确认渲染正确。 这就是单元测试在 Compose 中的典型用法 —— 快速、可靠、聚焦。

📌 核心回顾

  • 单元测试 是函数/Composable 级别的隔离验证。
  • 必要性:防止回归、快速反馈、提升代码质量。
  • 与集成测试的区别:范围、速度、依赖、定位精度不同。
  • 在 Compose 中,createComposeRule 是单元测试的基石。