6月初的HN热榜上,一篇"Did Claude increase bugs in rsync?"引爆开发者社区(391 points,398条评论)。同一天,另一篇167 points的文章给出了答案——"My Agent Skill for TDD"。本文拆解4步闭环工作流,给出可直接复制到 Claude Code / Hermes Agent / Cursor 的完整 Skill 模板。
AI 代码质量问题的根源
很多人看到 AI 生成的代码有 bug,第一反应是"AI 不行"。但真正的问题是:
- 速度诱惑:AI 10秒生成一个函数,开发者5秒扫一眼就合入——测试被跳过了
- 信任过载:"Claude 写的代码一般没问题"——这种心态是 bug 的温床
- 上下文盲区:AI 只看到你给它的代码片段,看不到整个系统的边界条件和副作用
- 缺乏反馈循环:没有自动化测试,每次修改都是盲飞
一条 HN 高赞评论精准总结了这点:"Claude is just a tool. The developers who merged that code and didn't properly test increased the bugs."
所以解法不是"少用 AI"——那是开倒车。解法是把测试融入 AI 工作流,让质量检查自动化。
TDD Agent Skill 的核心设计
传统 TDD 三步:Red(写失败测试)→ Green(写代码通过测试)→ Refactor(重构)。对于 AI Agent,我们把它适配为 4 步循环:
Step 1 - 写测试(人工或半人工): 你描述需求,AI 帮你生成测试用例。但测试的逻辑和边界条件由你确认——这是质量的锚点。
Step 2 - AI 生成代码: 将测试文件作为上下文传给 AI,明确要求"请生成通过以下测试的代码"。AI 有了明确的目标函数,幻觉大幅降低。
Step 3 - 自动运行测试: 代码生成后立即执行测试套件。失败了?把失败信息反馈给 AI,让它修复。这个循环自动进行,直到通过或达到最大迭代次数。
Step 4 - 人工 Review + 合入: 全部测试通过后,你只需要做一次最终的代码审查——关注架构和可读性,不需要逐行检查逻辑正确性(测试已经替你做了)。
Skill 文件:tdd-workflow.md
# TDD Workflow Skill
## 触发条件
当用户请求生成代码、实现功能、修复 bug 时自动激活。
## 核心规则
1. **先测试,后代码**:任何代码生成前,必须先确认测试用例存在
2. **红-绿-重构**:严格遵循 Red → Green → Refactor 循环
3. **失败即反馈**:测试失败时,将失败信息作为上下文传给 AI 修复
4. **覆盖率门禁**:新代码的测试覆盖率必须 ≥ 80%
## 工作流程
### Phase 1: 生成测试
- 分析用户需求,确定需要测试的函数/模块
- 生成测试用例(包含正常输入、边界值、异常情况)
- 让用户确认测试逻辑后再进入下一阶段
### Phase 2: 生成代码
- 将测试文件作为必须通过的约束条件
- 生成最小可行的实现代码
- 不要过度设计——只写通过测试所需的代码
### Phase 3: 验证循环
- 立即运行测试套件
- 如果失败:分析失败原因 → 修复代码 → 重新运行
- 最多迭代 5 轮,超过则请求人工介入
### Phase 4: 重构
- 测试通过后,检查代码可读性和架构
- 在不改变行为的前提下优化代码结构
- 重构后再次运行测试确保不引入回归
## 输出格式
每次完成工作流后,报告:
- 测试用例数 / 通过数
- 迭代轮数
- 覆盖率百分比
- 关键决策说明
实战演示:价格计算器
你的输入:
实现一个价格计算器:
- 单价 100 元
- 买 10 件以上打 9 折
- 折扣码 "VIP2026" 额外减 20 元
- 两个优惠可以叠加
- 最终价格不能低于 0
Agent Phase 1:生成测试用例(6个)
class TestCalculatePrice:
def test_no_discount(self):
assert calculate_price(5, None) == 500
def test_bulk_discount(self):
assert calculate_price(15, None) == 1350 # 1500*0.9
def test_vip_code(self):
assert calculate_price(5, "VIP2026") == 480 # 500-20
def test_stacked_discounts(self):
assert calculate_price(15, "VIP2026") == 1330 # 1500*0.9-20
def test_invalid_code(self):
assert calculate_price(5, "INVALID") == 500
def test_zero_price_floor(self):
assert calculate_price(1, "VIP2026") == 80 # 100-20
Agent Phase 2:生成实现(一次通过!)
def calculate_price(quantity: int, discount_code: str | None) -> int:
base = quantity * 100
if quantity >= 10:
base = int(base * 0.9)
if discount_code == "VIP2026":
base -= 20
return max(base, 0)
Agent Phase 3:自动运行测试
====== 6 passed in 0.12s ======
6 个测试,一次通过。零迭代修复。整个过程从需求到可用代码不到 3 分钟。
跨工具适配
| 工具 | 安装方式 | 使用命令 |
|---|---|---|
| Claude Code | cp tdd-workflow.md ~/.claude/skills/ |
/tdd 实现用户登录功能 |
| Hermes Agent | hermes skill install tdd-workflow |
用 tdd-workflow 实现XX功能 |
| Cursor | 写入 .cursorrules |
自动激活 |
常见问题
Q: TDD 会不会拖慢开发速度?
A: 短期会——写测试需要 3-5 分钟。但作者实测:首次通过率提升 3.2 倍,平均每功能仅需 2.1 轮迭代。
Q: AI 写的测试靠得住吗?
A: 不靠 AI 独立写测试。Phase 1 中 AI 生成测试草稿,你确认逻辑后再进入代码生成。边界条件和预期值必须由人把关。
Q: 老项目没测试怎么办?
A: 不要求 100% 覆盖率起步。对新功能严格 TDD,老代码在修改时补测试。渐进式改善。
行动建议
今天就可以做:
1. 复制 tdd-workflow.md 到你 Agent 的 skills 目录
2. 下一个要实现的功能,先让 AI 生成测试用例,确认后再生成代码
3. 配置 pytest --cov 或 vitest --coverage,让覆盖率可见
4. 设定规则:新代码无测试不合入
本周可以规划:
5. 把 TDD Skill 整合到团队 CI/CD 流水线——PR 没有测试自动拒绝
6. 统计引入 TDD 前后的 bug 率变化——用数据说服团队
7. 探索「AI 生成测试 + AI 生成代码 + 自动验证」的全自动流水线
记住那个 rsync 故事的教训:AI 写的代码不会天然有 bug,也不会天然没 bug——质量取决于你放进工作流的检查机制。 TDD 就是那个机制。
