测试驱动开发
角色定位
先用测试定义期望行为,再写最小实现让测试通过。这个 skill 负责行为变更的证据闭环,不负责铺满测试理论或替代专项浏览器 QA。
何时使用
- 新增或修改可观察行为。
- 修复 bug,需要先复现再修复。
- 重构可能影响现有行为。
- 需要为边界条件、错误路径或兼容性补回归保护。
不适用:纯文档、纯静态内容、无行为影响的配置调整。浏览器体验改动需要再接 browser-qa-testing。
快速路径
- 写清要证明的行为或 bug 症状。
- 选择最小测试层级:unit / integration / E2E。
- RED:先写一个会失败的测试,确认失败原因匹配目标。
- GREEN:写最小实现,只让当前测试通过。
- REFACTOR:在测试保持绿色的前提下简化实现。
- 跑相关回归测试,确认没有破坏邻近行为。
- 记录测试证据和仍未覆盖的风险。
Bug 修复 Prove-It 模式
Bug report -> Reproduction test fails -> Fix -> Reproduction test passes -> Regression suite passes
如果无法先写复现测试,必须说明原因,并给出替代证据,例如最小命令、日志、浏览器 transcript 或人工可复查步骤。
测试层级选择
| 层级 | 何时选 | 代价 |
|---|---|---|
| Unit | 纯逻辑、边界判断、数据转换 | 快,信心局部 |
| Integration | API、数据库、文件系统、模块边界 | 中等,能发现契约问题 |
| E2E / Browser | 用户关键路径、前端集成体验 | 慢,但最接近真实用户 |
默认从能证明目标的最低成本层级开始。不要为了形式写高层测试,也不要用过度 mock 让测试只证明实现细节。
测试质量门禁
- 测试名字描述行为,而不是实现细节。
- 断言结果状态,少断言内部调用顺序。
- 测试数据最小且可读,优先 DAMP 而不是过度 DRY。
- mock 只用于慢、不可控或有副作用的外部依赖。
- 每个测试失败时应指向一个清晰原因。
写复杂断言、mock 或测试 helper 前,读取 references/high-signal-tests.md,先命名测试要捕获的真实 break,并做独立期望与 mutation check。
反模式
- 先写实现,再补一个永远会过的测试。
- 修改测试来迁就错误实现。
- 跳过失败测试继续加功能。
- 用快照覆盖大量不稳定 UI,导致 diff 不可审。
- 为了覆盖率写不验证业务行为的测试。
输出契约
TDD evidence:
- Behavior:
- Test added/changed:
- Red result:
- Green result:
- Regression command:
- Remaining risk:
推荐结论使用:
Recommendation: <继续实现 / 修复测试 / 补更高层验证 / 进入 review> because <测试证据、风险和被放弃替代方案>。
没有读过失败输出和通过输出,不要声明测试闭环成立。