当前位置: 首页 > 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.rkmt.cn/news/1546283.html

相关文章:

  • 深度解析 Kotlin 运算符重载:提升 Android 开发效率的核心技巧
  • 中山市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • wifi是怎么连接的---四次握手(四)
  • OpenGL帧缓冲与后处理全链路实战|全网独家复现FBO构建、多通道渲染、滤镜优化,助力游戏特效、AR画面、图像美化高效落地
  • 中卫市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • SH9多尺度实验检验矩阵设计:桌面凝聚态模拟、地面精密测量和高能天体观测三个尺度的立体化检验矩阵(世毫九实验室原创研究)
  • ArcGIS实战:从数据到地图,掌握克里金插值核心流程
  • Android应用安全:Play Integrity API检测器构建与设备完整性验证实战
  • 机器学习模型生产化落地:从可运行到可运维的四层设计
  • 构建可信模型评估数学:从业务损益出发的指标设计方法
  • STM32通用GPIO模拟驱动TM1629A数码管的轻量级代码包(含.c/.h文件与Demo)
  • 为什么你用 AI 做的网站总有一股 AI 味?教你用 FlowyAIPC 快速生成高质量官网
  • WSL 幽灵入口清理记录与技术解析
  • AI寻聘方案评估:人才地图自动绘制、推荐理由及无简历匹配
  • 2026龙井茶场叶记茶铺十大口碑榜单,茶友精选攻略不踩雷 - mypinpai
  • 攀枝花市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 成都市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • USDPAA:Linux用户空间直接访问DPAA硬件加速架构的实战指南
  • 阳台漏水怎么办?找专业防水补漏师傅 - myqiye
  • 辽源市黄金回收本地靠谱店铺指南+白银回收+铂金回收+彩金回推荐收门店 及地联系方式址推荐 - 盛世金银回收
  • 深度学习自然语言处理:CBOW 模型原理与代码精讲
  • 滁州市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 2026年上海扫地车厂家TOP3推荐,哪个品牌最好 - 工业清洁测评社
  • 持续集成与持续部署(CI/CD):提升后端开发效率的关键技术
  • Android系统部分问题回顾
  • 3个关键步骤:用Rufus轻松解决Windows安装难题
  • 2026 合肥市全域彩钢瓦修缮四大正规企业权威测评|彩钢瓦翻新 / 防水补漏 / 除锈喷漆 / 钢结构屋面防腐完整榜单 + 江淮专属避坑指南 - 本地便民网
  • 收藏!小白程序员也能学会:大模型智能体开发工程师成长指南
  • 终极开源Suno替代方案:ACE-Step UI完整指南,免费本地AI音乐创作
  • 深度神经网络高效处理:从模型压缩到移动端部署的工程实践