研发协作
需要严格测试覆盖地实现功能或修 bug 时,用…
适用场景:用 TDD 实现新功能、按测试先行构建特性、或为 bug 修复补回归测试,确保每行生产代码都由一个先失败的测试驱动。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要严格测试覆盖地实现功能或修 bug 通用
解决思路
- 遵循核心循环:先写测试 → 看着它失败 → 写最小代码让它通过 → 重构;核心原则是「如果没有亲眼看到测试失败,就不知道它测的是不是对的东西」。
- 遵守铁律:NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST。若在测试之前写了代码,删除它并重新开始;不保留作「参考」、不在写测试时「改造」它、不看它——删除就是删除,从测试重新实现。
- RED 阶段:写一个最小的测试来表达应该发生什么,要求只测一个行为、命名清晰、使用真实代码(除非不可避免才用 mock);避免命名含糊(如 'retry works')、只验证 mock 调用(如 expect(mock).toHaveBeenCalledTimes(3))而不验证真实代码行为的测试。
- 必须验证 RED(不可跳过):运行测试(如 npm test path/to/test.test.ts 或 pytest path/to/test_file.py),确认测试是失败(fail)而非报错(error)、失败信息符合预期、失败原因是功能缺失而不是拼写错误。
- 若测试直接通过:说明你在测试已有行为,修测试;若测试报错:先修错误,重跑直到它以正确方式失败。
- GREEN 阶段:只写让测试通过的最简代码(例如用 for 循环重试 3 次),不添加测试之外的功能、不重构其他代码、不做「改进」(YAGNI,例如不要顺手加 maxRetries/backoff/onRetry 等参数)。
- 必须验证 GREEN:再次运行测试,确认该测试通过、其他测试仍然通过、输出干净(无错误、无警告);若该测试失败就改代码(不要改测试),若其他测试失败就立即修复。
- REFACTOR 阶段:只在绿灯之后进行——消除重复、改进命名、提取辅助函数;始终保持测试绿灯,且不添加新行为。
- 对照「常见借口 vs 现实」清单做自我检查并拒绝这些借口:『太简单不用测』(简单代码也会坏,写测试只要 30 秒)、『我稍后补测试』(测试立刻通过证明不了任何事)、『事后补测试效果一样』(事后测试问的是「它做了什么」,测试先行问的是「它应该做什么」)、『我已经手动测过了』(临时验证 ≠ 系统化,没记录、不能重跑)、『删掉几小时的代码太浪费』(沉没成本谬误,保留未验证代码就是技术债)、『先留着作参考、测试先写』(你一定会改造它,那就是事后测试;删除就是删除)、『我需要先探索』(可以,但探索代码要丢掉,从 TDD 重新开始)、『测试难写』(听测试的:难测 = 难用)、『TDD 会拖慢我』(TDD 比 debug 快)、『手动测试更快』(手动测不出边界情况,每次改动都要重测)。
- 遇到红旗信号立即停下并重来:测试前先写代码、实现后才写测试、测试立刻通过、说不清测试为什么失败、测试「以后再加」、用『就这一次』自我合理化、『我已经手动测过了』、『事后测试能达到同样目的』、『留着作参考』或『改造现有代码』——这些都意味着:删除代码,用 TDD 从头开始。
- 完成前逐项核对验证清单:每个新函数/方法都有测试;实现前亲眼看到每个测试失败;每个测试都因预期原因失败(功能缺失而非拼写错误);为通过每个测试写了最小代码;所有测试通过;输出干净(无错误、无警告);测试使用真实代码(mock 仅在不可避免时使用);覆盖边界情况和错误。有任何一项勾不上 → 说明你跳过了 TDD,重新开始。
- 卡住时按下表处理:不知道怎么测 → 先写期望的 API、先写断言、问人类搭档;测试太复杂 → 说明设计太复杂,简化接口;必须 mock 一切 → 代码耦合太紧,改用依赖注入;测试 setup 巨大 → 提取辅助函数,仍然复杂就简化设计。
- 按 agent 序列执行工作流:plan-agent 设计测试用例与实现方案(只输出测试计划,不写实现代码)→ arbiter 写失败测试(RED,运行确认失败且失败原因是功能缺失)→ kraken 写最小实现(GREEN,只写刚好让测试通过的代码,不加额外功能或「增强」,每次改动后跑测试)→ arbiter 跑全套测试验证(新测试通过、无既有测试被破坏、如可用则检查覆盖率)。
- 用 Task(subagent_type="plan-agent"|"arbiter"|"kraken", prompt="...") 派发各阶段任务,并在 prompt 里写明该阶段的约束(如干写测试的阶段要求 'DO NOT write any implementation code.';实现阶段要求 'Write ONLY enough code to make tests pass'、'Run tests after each change')。
- 强制以下 TDD 规则:arbiter 不能写实现代码;kraken 不能添加未经测试的功能;测试必须在实现之前失败;实现之后测试必须通过。
- GREEN 之后可选追加一个重构阶段:由 kraken 在保持全部测试绿灯的前提下清理代码、消除重复、改进命名、必要时提取辅助函数,且不添加任何新行为。
适用边界 · 注意事项
- 纯粹探索可行性、一次性 spike 或原型时,可以先自由探索,但探索代码必须全部丢弃,再以 TDD 从头实现,不要把探索代码当作可继续开发的基础。
- 在没有可执行测试框架、无法运行测试的环境下(无法「看着测试失败」),TDD 的前提不成立,应先建立可运行测试的能力再进入该流程。
- 当需求极其简单且短命、代码会被立即丢弃(如一次性临时脚本)时,投入完整 TDD 流程收益有限。