test-driven-development
红-绿-重构流程,测试金字塔 80/15/5,Beyonce 规则。
评分明细
适用场景
obra-test-driven-development 快速入门
强制 AI 走测试驱动开发,杜绝”先写代码后补测试”的借口。
这是什么?解决什么问题?
软件开发圈有一句老话:“测试驱动开发(TDD)是写出好代码的捷径”。但现实是,绝大多数开发者(包括 AI)在写代码时都跳过测试,理由五花八门:“时间紧”、“测试不好写”、“业务逻辑复杂,先看看能不能跑通”。
obra-test-driven-development Skill 强制 AI 走 TDD 流程:先写失败的测试(Red),写最少代码让它通过(Green),再重构(Refactor)。它还内置了几个重要原则:
- 测试金字塔 80/15/5:80% 单元测试、15% 集成测试、5% E2E 测试
- Beyonce 规则:“If you like it, you should put a test on it”——你写一行代码,就给它写一个测试
- DAMP 优于 DRY:测试代码里,描述性(Descriptive)比简洁性更重要,可以重复,不要过度抽象
这个 Skill 不是教你 TDD 理论,而是把这个流程编进 AI 的工作流,让 AI 没办法跳过测试。
准备工作
- Python 3.10+/Node.js 18+ 等主流语言环境
- 至少一种测试框架:pytest(Jest、Go test、Rust cargo test 都可)
- 支持 Skill 的 AI 客户端
- 一个待开发的小功能或待修复的 Bug
- 至少 1 小时学习时间
3 步快速上手
第 1 步:克隆仓库并查看 Skill
git clone https://github.com/addyosmani/agent-skills.git
cd agent-skills
ls skills/test-driven-development/
你会看到 SKILL.md、示例代码、测试模板。
第 2 步:加载 Skill
claude --skill obra-test-driven-development
启动后告诉 AI:
“我想给购物车功能加一个’满 100 减 20’的折扣规则,严格走 TDD。“
第 3 步:观察 AI 走 Red-Green-Refactor
AI 会按流程工作:
=== RED 阶段 ===
让我先写一个失败的测试,定义期望行为:
```python
def test_calculate_total_with_discount():
cart = ShoppingCart()
cart.add(Item(price=100))
assert cart.calculate_total() == 80 # 满100减20
运行 pytest: FAIL (因为 calculate_total 还没实现)
=== GREEN 阶段 === 写最少代码让它通过:
def calculate_total(self):
if sum(item.price for item in self.items) >= 100:
return sum(item.price for item in self.items) - 20
return sum(item.price for item in self.items)
运行 pytest: PASS
=== REFACTOR 阶段 === 代码太丑,重构一下:
def calculate_total(self):
subtotal = sum(item.price for item in self.items)
return subtotal - self._calculate_discount(subtotal)
def _calculate_discount(self, subtotal):
return 20 if subtotal >= 100 else 0
运行 pytest: PASS
整个流程跑下来,你的功能不仅可用,还有 100% 测试覆盖。
## 常见踩坑
1. **测试和实现同时写**:这是 TDD 的常见反模式。Skill 强制先测试后代码,但人写的时候容易偷懒。
2. **测试粒度过大**:一个测试覆盖 5 个分支,失败时不知道哪个出问题。要每个分支一个测试。
3. **测试里写逻辑**:`if/else` 出现在测试里,会让测试本身有 Bug。测试应该只描述输入输出。
4. **忽视测试金字塔**:全写 E2E 测试,跑一次要 10 分钟,反馈循环太长。Skill 会强制 80/15/5 比例。
5. **重构时跳过测试**:重构后必须跑测试,不能凭眼睛看代码就觉得对了。
6. **过度 mock**:mock 了一切外部依赖,导致测试和真实环境差异巨大,集成测试一定要做。
## 初级用法
- **新功能开发**:每个新功能都让 AI 走 TDD,产出代码时必然带着测试。
- **Bug 修复**:先写一个能复现 Bug 的测试(必然失败),再修代码,再跑测试通过。这是修 Bug 的金标准。
- **代码重构**:先保证现有测试覆盖,再让 AI 重构,如果有测试遗漏的行为,会被立刻发现。
## 高级玩法
- **覆盖率门槛**:在 Skill 配置里设置 80% 覆盖率门槛,CI 不到 80% 直接 fail。
- **Mutation Testing**:用 `mutmut` 或 `Stryker` 测试你的测试——故意改坏代码,看测试能不能抓到。
- **Property-Based Testing**:Skill 支持 hypothesis(Erlang QuickCheck 风格),让 AI 自动生成边界用例。
## 小技巧
- TDD 的反馈循环要快:每改一处就立刻跑测试,不要攒一堆再跑。
- 测试名要描述"行为"而不是"实现":`test_calculate_total_with_discount` 比 `test_total_method` 好。
- 一个测试只测一件事,失败时你立刻知道问题在哪。
- 不要测试 private 方法:private 是实现细节,公开行为变了再改测试。
- 重构时记得用 IDE 的 rename、extract 等自动化操作,不要手动改字符串。
## 常见问题 FAQ
**Q1: 这个 Skill 跟 obra-test-driven-development 有什么关系?必须装吗?**
A: Skill 是给 AI Agent 用的"技能包",能告诉 Agent 怎么按特定规范工作。**不是必须装**——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
**Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?**
A: obra-test-driven-development 来自 Obra,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
**Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?**
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
**Q4: 怎么验证 Skill 装对了?**
A: 在 Agent 中输入"列出已加载的 Skill"或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
**Q5: 这个 Skill 有许可证吗?能商用吗?**
A: 取决于 obra-test-driven-development 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
## 进阶学习建议
如果想进一步用好 obra-test-driven-development,建议按以下路径学习:
**第 1 周:熟练使用**
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录"哪些 prompt 有效、哪些没用"——形成自己的 prompt 笔记
**第 2 周:理解机制**
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的"触发关键词"和"输出格式"
- 学习"如何用更具体的描述触发 Skill"
**第 3-4 周:组合使用**
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
**长期:贡献社区**
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
**推荐资源**:
- 官方文档:https://github.com/addyosmani/agent-skills
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
**避免的坑**:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
## 参考链接
- Skill 仓库:https://github.com/addyosmani/agent-skills
- 测试驱动开发经典书《Test-Driven Development by Example》:https://www.amazon.com/Test-Driven-Development-Example-Addison-Wesley-Signature/dp/0321146530
- pytest 官方文档:https://docs.pytest.org/
- Jest 官方文档:https://jestjs.io/
- 测试金字塔原始论文:https://martinfowler.com/articles/practical-test-pyramid.html
## 我的个人推荐(测试编辑 Mnet)
**最常用的 1 个核心用法**:每天打开 Agent 第一时间加载这个 Skill,既不消耗太多 token 也能规范输出。
**最容易踩的坑**:别把 Skill 提示词当"开箱即用"的最终答案——它只是给你一个"标准框架",具体项目还得你自己调整。
**适合人群**:做过 3+ 个实际项目的开发者,而不是"看一遍文档就完事"的小白。
**3 个月使用心得**:刚开始用时觉得"规范是约束",用了 3 个月后才发现"规范是省时间"——避免每次重新决策同样的细节。
**推荐配合的工具**:Claude Code / Cursor / OpenCode 任选一个主流 Agent 即可,不要在工具选择上纠结太久。
**长期价值**:这类 Skill 的核心价值不是"立竿见影的输出",而是"持续一致的质量"——长期用下来,你的项目质量会稳定在专业水平。
---
> 本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
test-driven-development Skill 多维度简评
来源:obra/superpowers 类别:测试工具 / TDD 强制
一、核心定位与价值
这是 superpowers 的核心纪律——很多 AI 跳过”写测试”这一步,test-driven-development Skill 用强制状态机让 AI 没办法跳过。
二、核心机制:TDD 循环
🔴 RED: 写失败测试 → 验证失败正确
🟢 GREEN: 写最小代码 → 验证全部通过
🔵 REFACTOR: 清洁重构 → 验证仍然通过
↓
下一个测试
铁律:
在失败的测试之前,不写生产代码。
为什么”强制”?
普通 Prompt 的问题:
你说”请用 TDD 方式开发”,AI 点头称是,然后依然直接写实现。
superpowers 的做法:
把流程编码在 Skill 的状态机里——AI 必须按顺序走:
- 不写失败测试 → 不能写实现代码
- 实现代码后必须看到测试变绿
- 红-绿-重构必须完整循环
红线规则:如果发生以下任何情况,删除代码,用 TDD 重新开始:
- 在测试之前写了代码
- 实现之后才加测试
- 测试立即通过(说明测试没真正测试什么)
- 无法解释为什么测试失败
- “以后再加测试”
- 合理化”就这一次”
三、3 阶段实战详解
🔴 RED:写失败测试
做什么:写一个会失败的测试,验证它失败得正确。
示例:
// test/calculator.test.ts
import { add } from '../src/calculator'
describe('add', () => {
it('adds two positive numbers', () => {
expect(add(2, 3)).toBe(5) // ❌ 失败:add 还没实现
})
})
验证失败正确:
FAIL: add adds two positive numbers
Error: add is not a function
✅ 正确:失败原因是”函数不存在”,不是语法错误或其他问题。
🟢 GREEN:写最小代码
做什么:写最小的代码让测试通过。
示例:
// src/calculator.ts
export function add(a: number, b: number): number {
return a + b
}
不要过度:
// ❌ 错误:写了 100 行实现,但测试只覆盖了 + 操作
export function add(a: number, b: number): number {
// 100 行复杂逻辑...
}
TDD 原则:只写让测试通过的最小代码。
🔵 REFACTOR:清洁重构
做什么:在测试通过的前提下,改进代码质量。
重构原则:永远不要在重构时改变行为。
四、3 个测试反模式(Anti-patterns)
❌ 反模式 1:测试实现细节
// ❌ 测试了私有方法
expect(calculator._add).toBe(5)
// ✅ 测试公开行为
expect(calculator.add(2, 3)).toBe(5)
❌ 反模式 2:测试间共享状态
// ❌ 全局变量
let user: User
beforeAll(() => { user = createUser() })
// ✅ 每个测试独立
beforeEach(() => { user = createUser() })
❌ 反模式 3:测试名不清晰
// ❌
it('test 1', () => { ... })
it('works', () => { ... })
// ✅
it('returns 5 when adding 2 and 3', () => { ... })
it('throws error when input is negative', () => { ... })
五、5 条反合理化(Anti-rationalization)
| 借口 | 反驳 |
|---|---|
| ”这代码太简单,不用测” | 简单代码也会引入 bug,TDD 不挑难度 |
| ”我之后再补测试” | TDD 反对这种”之后”,现在必须 |
| ”测试代码不是生产代码” | 测试代码同样是工程资产 |
| ”写测试浪费时间” | 调试浪费时间,写测试节省更多 |
| ”这是原型代码” | 原型也会变生产,提前测试 |
六、与其他 Skill 配合
test-driven-development 是 superpowers 工作流的第 5 步:
brainstorming(设计)
↓
writing-plans(计划)→ TDD 是计划中的核心环节
↓
subagent-driven-development(执行)
↓
test-driven-development(TDD)
↓
requesting-code-review(审查)
每个任务都必须走完整 TDD 循环。
七、安装
# superpowers 套装
/plugin install superpowers@claude-plugins-official
# 单独使用
npx skills add obra/superpowers --skill test-driven-development
八、6 条实战建议
- 不要跳步:每个循环都要完整 RED-GREEN-REFACTOR
- 测试名要清晰:能看出测试什么场景
- 不要测实现细节:只测公开行为
- 不要共享状态:每个测试独立
- 覆盖率不是目标:质量才是
- Bug 修复也是 TDD:先复现成测试,再修
九、常见 Q&A
Q: 100% 覆盖率必须吗? A: 不是目标。重要业务逻辑要 100%,UI/工具函数可以适度。
Q: 测试越多越好? A: 不是。重复测试、无效测试反而拖累。
Q: 重构时要不要改测试? A: 重构保持行为不变时,测试不需要改。如果改了,说明行为变了,需要重新审视。
Q: 性能测试怎么办? A: 性能测试不是 TDD 的目标,用专门的 benchmark。
Q: TDD 适合 UI 代码吗? A: 适合。用 React Testing Library 测试组件行为。
十、总结
test-driven-development Skill 是 AI 编程从”写代码”到”做工程”的关键纪律。
核心价值:
- 强制红绿重构循环
- 防止 AI 跳过测试
- 提高代码质量
适用人群:
- ✅ 严肃工程项目
- ✅ 团队规范化
- ✅ 长期维护项目
本文基于官方文档和公开资料整理,未经过 MagicNetWorld 实测。
参考资料
- obra/superpowers 官方仓库 — GitHub 官方仓库
- test-driven-development SKILL.md 源码 — 官方 Skill 定义
- Simon Willison: Red/green TDD — Agent 工程模式指南
- OpenCodeDocs: TDD Workflow 教程 — TDD 工作流详解
- b-lab.team: Superpowers 深度解析 — 方法论分析
快速安装
git clone https://github.com/addyosmani/agent-skills.git
cd agent-skills
ls skills/test-driven-development/