Test coverage 不必要:想测就测
solo engineer 没有 test coverage。simedw 一个人 iPhone app——他决定测什么,他决定怎么测,他决定何时不测。test coverage 是大公司质量保证工具,一人工程的感觉 = coverage。
solo engineer 没有 test coverage。
大公司做 test coverage:
- line coverage:每行代码被执行的百分比(目标 100%)
- branch coverage:每个 if/else 分支被执行的百分比(目标 80%)
- function coverage:每个函数被调用的百分比(目标 100%)
- statement coverage:每个 statement 被执行的百分比(目标 100%)
- Codecov / Coveralls:coverage 可视化平台
- coverage gate:PR 必须 coverage 不下降才能 merge
- mutation testing:mutant 杀灭率(目标 80%)
一人工程做 test coverage:
- 没有 line coverage
- 没有 branch coverage
- 没有 Codecov
- 没有 coverage gate
simedw 的 test 哲学
simedw 是 iPhone piano app。他没有 test coverage:
- simedw 写代码时自己测:写完 function 跑一下
- simedw 在 iPhone 上跑:手动测 UI + latency
- simedw 听 piano app:手动听 piano sound
- simedw 跑 14 次实验:每次实验自己跑训练 + 测 loss
- simedw 用 Gemini pairwise:LLM 自动评估 continuation 质量
不需要 Codecov,因为:
- simedw 自己测 = 100% coverage(开发者测过 = 测过)
- simedw 感觉 = coverage(手感好 = 通过)
- simedw 不需要 gate(自己批准 = 通过)
一人工程的 test 工具
- 手动测:simedw 写完代码跑一下
- iPhone TestFlight:beta 用户测(如果 simedw 有 = simedw 自己)
- Crashlytics:自动收集 crash 数据
- App Store 评论:用户反馈 bug
- HN 评论:用户反馈功能
- Xcode unit test:simedw 写 unit test(如果需要)
- PyTorch 训练 loss:自动记录每次实验 loss
不需要 Codecov,因为 simedw 自己 = coverage。
test coverage 在大公司的政治
test coverage 不是工具——是质量保证工具 + 政治工具:
- QA:要用 coverage 决定 release 是否 ready
- CTO:要用 coverage 决定 codebase 质量
- VP:要用 coverage 决定团队绩效
- HR:要用 coverage 评估工程师
- PM:要用 coverage 知道 feature 何时 ready
- 销售:要用 coverage 知道 enterprise feature 质量
每个 stakeholder 都要 coverage:
- QA coverage = "release ready"
- CTO coverage = "codebase 健康"
- VP coverage = "团队表现"
- HR coverage = "工程师质量"
- PM coverage = "feature ready"
- 销售 coverage = "enterprise 质量"
没有 coverage = 没有质量 = 没有 release。
一人工程没有 stakeholder:
- 开发者 = QA = CTO = VP = HR = PM = 销售
- 一个人 coverage
- 不需要 Codecov
coverage gate 在大公司的必要性
大公司有 coverage gate——PR 必须 coverage 不下降才能 merge:
- 当前 main branch coverage:85%
- 新 PR coverage:83%(下降)
- gate 失败:PR 不能 merge,必须加 test 把 coverage 提到 85%
每个 coverage gate:
- Codecov 自动检查
- GitHub Actions 集成
- 必须 coverage ≥ main 才能 merge
一人工程没有 coverage gate。一人工程有:
- simedw 自己决定测什么:simedw 写代码时知道哪里需要 test
- simedw 不需要 gate:simedw 自己批准
- simedw 不需要 Codecov:simedw 自己 = Codecov
mutation testing 在大公司的细节
大公司 mutation testing——mutant 杀灭率:
- mutant:自动改一行代码(if → else, + → -, return → return null)
- 杀灭 mutant:test 失败 = mutant 被杀
- 未杀灭 mutant:test 通过 = mutant 存活
- 杀灭率:被杀 / 总 mutant
每个 mutation testing:
- 自动跑几千个 mutant
- 每个 mutant 跑全 test suite
- 几小时跑完
一人工程没有 mutation testing。一人工程有:
- simedw 自己改代码:simedw 改一行代码自己测
- simedw 不需要自动 mutant:simedw 改一行就知道哪里会 break
- simedw 不需要几千个 mutant:simedw 改一行就够
mutation testing 在一人工程里 = simedw 自己改代码。
line coverage vs branch coverage
大公司区分两种 coverage:
- line coverage:每行被执行(容易达到 100%)
- branch coverage:每个分支被执行(难达到 100%)
例子:
def f(x):
if x > 0:
return 1
else:
return 0
- line coverage:测一次 x=1 → 100%(3 行执行)
- branch coverage:测 x=1 + x=0 → 100%(两个分支执行)
一人工程没有 line / branch coverage 区分。一人工程有:
- simedw 自己知道:simedw 写代码时知道每个分支
- simedw 测过就过:simedw 跑过 case 就知道
- simedw 不需要 100%:simedw 测重要的 case,不重要的 case 不测
test pyramid 在大公司的细节
大公司 test pyramid:
- unit test:70%(测试单个 function)
- integration test:20%(测试多个 module)
- e2e test:10%(测试整个系统)
每个 test:
- unit test:每个 function 一个 test
- integration test:每个 module 集成一个 test
- e2e test:每个 user flow 一个 test
一人工程没有 test pyramid。一人工程有:
- simedw 写 test 时决定:simedw 测 unit 还是 integration 由自己决定
- simedw 不需要 70/20/10:simedw 测重要的 + 测的就行
- simedw 不需要 e2e:simedw 在 iPhone 上手动跑 = e2e
flaky test 在大公司的痛点
大公司 flaky test——test 不稳定(有时候 pass 有时候 fail):
- flaky test 占比:5-10%
- flaky test 修复:几小时到几天
- flaky test 影响:CI 失败 → PR 阻塞 → 工程师 frustration
- flaky test 解决:quarantine + 重跑 + 修复
每个 flaky test:
- 自动检测(CI 跑 3 次)
- quarantine(不阻塞 PR)
- 工程师修复
一人工程没有 flaky test。一人工程有:
- simedw 自己测 = 不 flaky:simedw 跑测试时如果 fail = 真的 fail,不 flaky
- simedw 不需要 quarantine:simedw 自己看 fail 立即修
- simedw 不需要自动检测:simedw 自己跑就知道
一人工程的 coverage 哲学
大公司 test coverage 是因为他们有:
- 100 个工程师(需要 gate 防止 coverage 下降)
- 10 个 QA(需要 coverage 决定 release)
- 5 个 VP(需要 coverage 评估团队)
- 1 个 CTO(需要 coverage 决定 codebase 健康)
一人工程没有这些。一人工程有:
- 0 个工程师(自己就是工程师)
- 0 个 QA(自己就是 QA)
- 0 个 VP(自己就是 VP)
- 0 个 CTO(自己就是 CTO)
test coverage 在一人工程里 = 自己想测就测。
我就是 coverage
大公司 coverage 是多角色测量的:
- 工程师写 test
- QA 跑 coverage
- Codecov 可视化
- VP 看 dashboard
一人工程 coverage 是一个人测的:
- simedw 写代码时自己测
- simedw 跑测试时自己看结果
- simedw 不需要 Codecov
- simedw 自己 = Codecov
公开 vs 私有 coverage
大公司 coverage 是半公开:
- coverage dashboard 公开(公司内部)
- coverage trend 公开(团队内部)
- mutation rate 公开(公司内部)
一人工程 coverage 是完全公开:
- git log 公开(commit message 包含测试状态)
- App Store 评论公开(用户反馈 bug)
- HN 评论公开(用户反馈功能)
simedw 的 coverage 通过 App Store 评论 + HN 评论公开——所有 bug / 功能问题都公开。
一人工程 + 想测就测
simedw 不做 line coverage。 simedw 不做 branch coverage。 simedw 不做 mutation testing。 simedw 不做 Codecov。 simedw 想测就测。
test coverage 在一人工程里不是工具,是simedw 的感觉。
solo engineer 没有 test coverage。 solo engineer 的 test coverage = 想测就测 + 感觉 + App Store 评论。
solus opus.