当前位置: 首页 > news >正文

第七篇:进阶篇 —— 工程化与质量保障 第14章 自动化测试:构筑代码质量的防火墙

第七篇:进阶篇 —— 工程化与质量保障

第14章 自动化测试:构筑代码质量的防火墙

在第十三章,我们通过 Profiler 优化了 App 的性能。但如果我们改了一行代码,修复了一个 Bug,却不小心引入了三个新 Bug 怎么办?靠人工点点点测试,在 2026 年是低效且不可靠的。

自动化测试是专业开发者的护城河。它是一张安全网,让你敢于重构代码、升级依赖、添加新功能,而无需担心把 App 搞崩。

本章将带你构建三层测试体系:单元测试(Unit Test)集成测试(Integration Test)UI 测试(UI Test)。我们将使用 2026 年最新的测试栈:JUnit 5 + MockK + Turbine + Compose UI Test。我们将深入测试的哲学、Mock 的底层原理、以及如何测试 Kotlin 协程和 Flow。

14.1 测试金字塔:你应该写哪些测试?(深度解析)

并不是测试越多越好,而是要分层。

测试类型占比速度成本关注点2026年工具栈
UI 测试10%模拟用户操作,验证界面流程(如:点击登录按钮是否跳转到主页)。Compose UI Test
集成测试20%验证模块协作(如:ViewModel 调用 Repository 是否能拿到数据)。Hilt + Robolectric
单元测试70%极快验证最小功能单元(如:一个工具函数、一个 ViewModel 的状态计算)。JUnit 5 + MockK + Turbine

核心原则:测试应该是快速的。如果你跑一次测试需要 5 分钟,没人会跑。

14.1.1 为什么是 70/20/10?
  • 单元测试(70%):最便宜,最快。它们不依赖 Android 框架,直接在 JVM 上运行。你应该为每一个业务逻辑类编写单元测试。
  • 集成测试(20%):验证组件之间的交互。例如,ViewModel 是否正确调用了 Repository,数据库是否正确保存了数据。
  • UI 测试(10%):最昂贵,最慢。它们运行在真机或模拟器上,模拟真实用户操作。只为核心业务流程编写 UI 测试。

14.2 单元测试:JUnit 5 与 MockK(深度解析)

单元测试是针对纯 Kotlin 代码的测试,不依赖 Android 设备,直接在 JVM 上运行。

14.2.1 配置测试环境(深度解析)
// build.gradle.kts (App)dependencies{// JUnit 5 (Jupiter)testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")testRuntimeOnly("org.junit.platform:junit-platform-launcher")// MockK (Kotlin 专用 Mock 框架,替代 Mockito)testImplementation("io.mockk:mockk:1.13.9")// Turbine (测试 Flow 的神器)testImplementation("app.cash.turbine:turbine:1.0.0")// 测试协程testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0")}
14.2.2 JUnit 5 注解详解(深度解析)
注解作用示例
@Test标记一个测试方法@Test fun addition_isCorrect()
@BeforeEach每个测试方法前执行@BeforeEach fun setup()
@AfterEach每个测试方法后执行@AfterEach fun tearDown()
@BeforeAll所有测试方法前执行一次@BeforeAll companion object { ... }
@AfterAll所有测试方法后执行一次@AfterAll companion object { ... }
@DisplayName测试显示名称@DisplayName("加法测试")
@Nested嵌套测试类@Nested inner class AdditionTests
@Timeout超时测试@Timeout(1, unit = TimeUnit.SECONDS)
14.2.3 测试一个简单的工具类(深度实战)

假设我们有一个StringUtils.kt

// utils/StringUtils.ktobjectStringUtils{funisValidEmail(email:String):Boolean{returnemail.contains("@")&&email.contains(".")}funformatPrice(price:Double):String{return${String.format("%.2f",price)}"}}

编写测试:

// test/java/com/example/myfirstapp/utils/StringUtilsTest.ktimportorg.junit.jupiter.api.Assertions.assertFalseimportorg.junit.jupiter.api.Assertions.assertTrueimportorg.junit.jupiter.api.DisplayNameimportorg.junit.jupiter.api.TestclassStringUtilsTest{@Test@DisplayName("Valid email should return true")fun`isValidEmail returns true for valid email`(){// Givenvalemail="test@example.com"// Whenvalresult=StringUtils.isValidEmail(email)// ThenassertTrue(result)
http://www.jsqmd.com/news/1034386/

相关文章:

  • 镇江市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 山东宏元环保生物质气化设备靠谱吗? - mypinpai
  • 01:SpringAI
  • 时间序列五大基本性质:趋势、季节性、平稳性、自相关与异常性的工程化诊断框架
  • 如何快速解锁加密音乐文件:3步实现跨平台音乐自由播放
  • 郑州市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 【招聘】创业公司引力场:用F=ma重新理解你的人才竞争力
  • AI工程的本质不是调参,而是系统思维重构
  • 5个实战技巧:深度解析SecHex-Spoofy系统标识伪装工具的应用场景
  • 深度解析 Kotlin 运算符重载:提升 Android 开发效率的核心技巧
  • 分析抛丸厂商哪家好,晟丰电气优势突出 - mypinpai
  • 深入探索nf-core/sarek基因组变异检测架构:高性能实战指南
  • wifi是怎么连接的---四次握手(四)
  • 中山市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 腾讯智绘App:移动端AIGC轻量化实践与中文提示词工程
  • OpenGL帧缓冲与后处理全链路实战|全网独家复现FBO构建、多通道渲染、滤镜优化,助力游戏特效、AR画面、图像美化高效落地
  • 中卫市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 机器学习实验追踪:构建可复现、可交付的模型研发流程
  • SH9多尺度实验检验矩阵设计:桌面凝聚态模拟、地面精密测量和高能天体观测三个尺度的立体化检验矩阵(世毫九实验室原创研究)
  • ArcGIS实战:从数据到地图,掌握克里金插值核心流程
  • Android应用安全:Play Integrity API检测器构建与设备完整性验证实战
  • 机器学习模型生产化落地:从可运行到可运维的四层设计
  • 构建可信模型评估数学:从业务损益出发的指标设计方法
  • 为什么你用 AI 做的网站总有一股 AI 味?教你用 FlowyAIPC 快速生成高质量官网
  • WSL 幽灵入口清理记录与技术解析
  • 过拟合诊断与防治:从数据根因到工业级七层防御体系
  • AI寻聘方案评估:人才地图自动绘制、推荐理由及无简历匹配
  • 2026龙井茶场叶记茶铺十大口碑榜单,茶友精选攻略不踩雷 - mypinpai
  • 攀枝花市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 2026 安徽蚌埠全域彩钢瓦修缮四大正规企业权威评测|皖北冻融高温厂房金属屋面除锈防水完整榜单 + 本地专属避坑指南 - 本地便民网