SuperAPI AI 工具集

test-driven-development

测试与质量

查看项目

更新于 10-16 04:24

技能介绍

用途

该技能用于指导严格的测试驱动开发(Test-Driven Development,TDD),采用红-绿-重构(Red-Green-Refactor)循环。其核心目标是确保在编写任何生产代码之前,先有一个失败的测试。核心原则是:如果你没有亲眼看到测试失败,你就不知道它是否测试了正确的东西。违反规则的文字就是违反规则的精神。

主要能力

技能围绕红-绿-重构循环展开:

  • RED(红):编写一个最小的失败测试,展示应该发生什么。要求一个行为、清晰的名称、使用真实代码(除非不可避免,否则不使用 mock)。
  • 验证 RED:强制步骤,绝不跳过。运行测试,确认测试失败(而非报错)、失败消息符合预期、失败原因是功能缺失(而非拼写错误)。如果测试通过,说明你在测试已有行为,需要修正测试;如果测试报错,修复错误并重新运行,直到它正确失败。
  • GREEN(绿):编写最简单的代码使测试通过。不要添加功能、重构其他代码或超出测试范围进行“改进”。
  • 验证 GREEN:强制步骤。运行测试,确认测试通过、其他测试仍然通过、输出干净(无错误、警告)。如果测试失败,修复代码而非测试;如果其他测试失败,立即修复。
  • REFACTOR(重构):仅在绿灯之后进行。消除重复、改进命名、提取辅助函数。保持测试绿灯,不添加行为。
  • 重复:为下一个功能编写下一个失败测试。

使用方式

技能通过明确的规则和检查清单来约束开发流程。铁律是:没有失败的测试就不写生产代码。如果先写了代码再写测试,必须删除代码并从头开始,不得保留为“参考”、不得在写测试时“改编”它、不得查看它。删除就是删除,从测试重新实现。

技能提供了验证检查清单,在标记工作完成前需确认:每个新函数/方法都有测试;在实现前亲眼看到每个测试失败;每个测试因预期原因失败(功能缺失而非拼写错误);编写最小代码使每个测试通过;所有测试通过;输出干净(无错误、警告);测试使用真实代码(仅在不可避免时使用 mock);覆盖边界情况和错误。如果无法勾选所有项,说明跳过了 TDD,需要重新开始。

技能还包含常见合理化借口的对照表,例如“太简单不需要测试”“我稍后测试”“已经手动测试过”“删除 X 小时的工作太浪费”“TDD 太教条,务实意味着变通”等,并逐一给出反驳。同时列出危险信号,如测试前写代码、实现后写测试、测试立即通过、无法解释测试为何失败、合理化“就这一次”等,出现这些信号意味着:删除代码,用 TDD 重新开始。

适用场景

始终适用于:新功能、缺陷修复、重构、行为变更。

例外情况(需询问人类伙伴):一次性原型、生成代码、配置文件。

限制

技能明确要求不得在没有失败测试的情况下编写生产代码,除非获得人类伙伴的许可,否则没有例外。技能不涉及具体编程语言或测试框架的安装配置,示例使用 TypeScript 和 npm test 命令。技能强调测试优先与测试后写的本质区别:测试后写回答“这段代码做什么?”,测试优先回答“这段代码应该做什么?”。测试后写会受到实现的偏见影响,验证的是你构建的东西而非需求,验证的是你记得的边界情况而非发现的边界情况。