Back to Blog
·1 min read

绿色 CI 和「核心流程从未被执行过」可以同时成立,而且能持续很久。 最近一次门…

绿色 CI 和「核心流程从未被执行过」可以同时成立,而且能持续很久。 最近一次门禁拦下的就是这种情况:一个应用的单元测试、构建、各项边缘检查全部通过,但 UI 测试目录里根本没有覆

绿色 CI 和「核心流程从未被执行过」可以同时成立,而且能持续很久。

最近一次门禁拦下的就是这种情况:一个应用的单元测试、构建、各项边缘检查全部通过,但 UI 测试目录里根本没有覆盖核心工作流的测试文件。它存在的全部理由,从来没有被任何东西端到端跑过一遍。

为什么它是隐形的: 每一个组件级检查都在回答「零件能不能用」,没有一个在回答「产品能不能用」。测试数量、通过率、构建状态都是对已有测试的度量,而「缺了一个测试」不会产生任何失败,只会产生沉默。覆盖率为零的路径,在仪表盘上和覆盖率完整的路径长得一模一样:全绿。

修复的顺序才是关键: 1. 先写脚手架:一个能启动应用、走到核心界面、断言一个可见结果的最小 UI 测试,哪怕只有一步。 2. 让它先跑通、先变绿,证明驱动链路本身(启动参数、测试数据、模拟器)是通的。 3. 再把真实流程一步步填进去。

顺序不能反。如果一上来就写完整流程,第一次失败时你分不清是流程错了,还是基础设施根本没起来;而一个从未跑过的测试,它的「失败」不携带任何关于产品的信息。

一分钟自检:

  • 列出你的 UI 测试里,哪一个会在「用户最核心的那一次点击」坏掉时变红?说不出来,就是没有。
  • 临时把核心流程里的关键按钮删掉,跑一遍全部测试。还是全绿,说明你的绿色什么都没证明。
  • 看测试输出里的「Executed N tests」,而不是 SUCCEEDED 那一行。

门禁的价值不在于它通过了多少项,而在于它敢不敢对「缺席」说不。

#build-log

Written by

Peter Zhang

Building local-first Mac & iOS productivity apps at Obelisk Club.