SuperAPI AI 工具集

tdd

测试与质量

查看项目

更新于 10-15 10:24

技能介绍

用途

TDD(Test-Driven Development)是一个测试驱动开发技能,核心是“红 → 绿”循环。该技能作为参考规范,目标是让这个循环产出真正值得保留的测试:说明什么是好测试、测试应该放在哪里、有哪些反模式,以及循环本身的规则。技能强调,每一节内容都适用于每一个循环周期,应当在循环之前和进行中查阅,而不是在循环结束后才看。

适用场景包括:用户希望以测试先行的方式构建功能或修复缺陷、提到“red-green-refactor”(红-绿-重构),或希望编写集成测试。

主要能力

什么是一个好测试

测试通过公共接口验证行为,而不是验证实现细节。代码可以完全重写,测试不应该需要跟着改。一个好的测试读起来像一份规格说明:例如“user can checkout with valid cart”能准确说明存在什么能力,并且由于它不关心内部结构,因此能在重构后依然存活。相关资料指向 tests.md(测试示例)和 mocking.md(mock 使用指南)。

接缝(Seam):测试应该放在哪里

接缝是指你进行测试的公共边界:在这个接口上你可以观察行为而无需深入内部。测试应当位于接缝处,绝不应针对内部实现编写。

只能在事先商定的接缝上编写测试。在编写任何测试之前,先写下待测试的接缝并与用户确认。没有确认的接缝不写测试。你不可能测试一切,因此提前商定接缝,可以让测试投入落在关键路径和复杂逻辑上,而不是浪费在每个边缘情况上。

需要询问:“公共接口是什么,我们应该测试哪些接缝?”对每个提议的接缝,用一句话说明它能捕获什么、会漏掉什么。

当接口本身的形态存在疑问时(例如模块应该有多深、接缝应该放在哪里、接口应该暴露什么),可以通过 Skill 工具调用“codebase-design”来获取统一词汇。该技能是模块、接口、深度、接缝、适配器、杠杆和局部性等术语的共同来源,并且是一份可供查阅的参考,而不是一个需要运行的会话。

反模式

  • 实现耦合(Implementation-coupled):mock 内部协作者、测试私有方法,或通过侧信道验证(例如查询数据库而不是使用接口)。判断标志是:重构时测试失败,但行为并没有改变。
  • 同义反复(Tautological):断言以与代码相同的方式重新计算期望值(如 expect(add(a, b)).toBe(a + b),手工按同样方式推导的快照,把常量断言为它自身),因此它按构造就会通过,永远不可能与代码产生分歧。期望值必须来自独立的事实来源:已知正确的字面量、已算好的示例,或规格说明。
  • 横向切片(Horizontal slicing):先写完所有测试,再写所有实现。批量测试验证的是想象出来的行为:你测试的是事物的形状而不是面向用户的行为,测试对真实变化变得不敏感,并且在理解实现之前就锁定了测试结构。应当改用纵向切片:一个测试 → 一个实现 → 重复,每个测试都是一颗曳光弹,响应上一个循环教给你的东西。

循环规则

  • 红色先于绿色。先写失败的测试,然后只写足够让其通过的代码。不要预判未来的测试,也不要添加投机性的功能。
  • 一次一个切片。每个循环一个接缝、一个测试、一个最小实现。
  • 重构不属于循环的一部分。重构属于评审阶段(参见 code-review 技能),而不是红 → 绿实现循环。

使用方式

在探索代码库时,读取 GLOSSARY.md(如果存在),使测试名称和接口词汇与项目的领域语言保持一致,并尊重你正在改动的区域中的 ADR。在编写任何测试前,先写出待测试的接缝并与用户确认;随后按“一个测试 → 一个实现”的纵向切片方式推进循环。当接口形态本身存疑时,可查阅 codebase-design 技能获取术语参考。

适用场景

  • 希望以测试先行的方式构建功能或修复缺陷。
  • 需要编写集成测试。
  • 提到“red-green-refactor”开发流程。

限制

关于收费、价格、平台支持等事实,资料中暂未提供。技能资料主要描述方法论、规则与反模式,未提供具体安装命令或代码示例。