mcpField
T
tdd

tdd

github.com/ryanravn测试与质量0161 次安装16 周前更新
代码仓库

关于 tdd

这是一份指导行为驱动测试开发的技能文档,面向希望让测试围绕公开接口和用户可观察行为的开发者。它强调逐个测试、逐步实现的垂直切片,并提供规划、重构和每轮检查清单。

主要功能

  1. 01测试聚焦公开接口行为
  2. 02采用逐项红绿循环
  3. 03避免水平切片反模式
  4. 04提供规划与重构步骤
  5. 05包含每轮测试检查清单

适用场景

  1. 01规划逐步推进的 TDD 工作
  2. 02减少测试与实现细节的耦合
  3. 03在重构前后验证可观察行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ryanravn/ryra-skills --skill tdd

安装后在 Claude Code 中输入/tdd确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

mocking.md
refactoring.md
tests.md

详细介绍

测试驱动开发

理念

核心原则:测试应通过公共接口验证行为,而非实现细节。代码可以彻底改变,测试不应受影响。

好的测试采用集成测试的方式:通过公共 API 路径运行真实代码。它们描述系统_做什么_,而非_如何_做。好的测试读起来就像一份规范——“用户可以使用有效购物车完成结账”清楚地说明了系统具备什么能力。这类测试经得起重构,因为它们不关心内部结构。

糟糕的测试与实现细节耦合。它们会模拟内部协作者、测试私有方法,或通过外部手段验证(例如直接查询数据库,而不是使用接口)。警示信号是:重构时测试失败,但行为并未改变。如果重命名一个内部函数就导致测试失败,那么这些测试测的是实现,而非行为。

示例请参阅 tests.md,模拟指南请参阅 mocking.md。

反模式:水平切片

不要先写完所有测试,再写所有实现。 这就是“水平切片”——把 RED 阶段当作“编写所有测试”,把 GREEN 阶段当作“编写所有代码”。

这会产生糟糕的测试:

  • 批量编写的测试测的是_臆想的_行为,而非_实际的_行为
  • 你最终测试的是事物的_形状_(数据结构、函数签名),而非面向用户的行为
  • 测试会对真实变化不敏感——行为出问题时它们仍会通过,行为正常时却会失败
  • 你会超出自己的认知范围,在理解实现之前就确定了测试结构

正确做法:通过示踪弹进行垂直切片。一个测试 → 一个实现 → 重复。每个测试都建立在你从上一个循环中学到的内容之上。因为你刚写完代码,所以你清楚哪些行为重要,以及如何验证它们。

WRONG (horizontal):
  RED:   test1, test2, test3, test4, test5
  GREEN: impl1, impl2, impl3, impl4, impl5

RIGHT (vertical):
  RED→GREEN: test1→impl1
  RED→GREEN: test2→impl2
  RED→GREEN: test3→impl3
  ...

工作流

1. 规划

探索代码库时,阅读 CONTEXT.md(如果存在),确保测试名称和接口术语符合项目的领域语言,并遵循你正在修改区域的 ADR。

编写任何代码之前:

  • 与用户确认需要进行哪些接口变更
  • 与用户确认要测试哪些行为(并确定优先级)
  • 找出构建深层模块(接口简单、实现深入)的机会——运行 /codebase-design skill,获取相关术语并检查可测试性
  • 列出要测试的行为(而非实现步骤)
  • 获得用户对计划的批准

询问:“公共接口应该是什么样的?哪些行为最值得优先测试?”

你无法测试所有内容。 与用户明确确认哪些行为最重要。将测试精力集中在关键路径和复杂逻辑上,而不是覆盖每一种可能的边缘情况。

2. 示踪弹

编写一个测试,确认系统的一项行为:

RED:   Write test for first behavior → test fails
GREEN: Write minimal code to pass → test passes

这是你的示踪弹,用于证明整个端到端路径能够正常工作。

3. 增量循环

针对其余每项行为:

RED:   Write next test → fails
GREEN: Minimal code to pass → passes

规则:

  • 一次只写一个测试
  • 只编写足以通过当前测试的代码
  • 不要预先考虑未来的测试
  • 让测试专注于可观察的行为
4. 重构

所有测试通过后,查找重构候选项:

  • 消除重复
  • 加深模块(将复杂性移到简单接口之后)
  • 在适当时应用 SOLID 原则
  • 思考新代码揭示了现有代码的哪些问题
  • 每完成一个重构步骤后都运行测试

绝不要在 RED 阶段重构。 先达到 GREEN。

每个循环的检查清单

[ ] Test describes behavior, not implementation
[ ] Test uses public interface only
[ ] Test would survive internal refactor
[ ] Code is minimal for this test
[ ] No speculative features added

评论

支持 Markdown