关于 tdd
面向编码 Agent 的测试驱动开发行为规范,强调通过公共接口验证行为、先确认单个失败测试,再以最少代码实现并重构。
主要功能
- 01通过公共接口测试行为
- 02实现前编写单个失败测试
- 03以最少代码通过测试
- 04断言具体不变量
- 05遵循红绿重构循环
适用场景
- 01根据验收标准实现功能
- 02检查领域不变量与边界
- 03避免测试依赖私有实现
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ venhdev/ skills --skill tdd安装后在 Claude Code 中输入/tdd确认已加载。
详细介绍
tdd — 测试驱动开发行为协议
操作不变量
- 仅限公开接口:严格通过公开模块接口测试可观察行为;绝不针对私有辅助方法或内部状态变量进行断言。
- 单个失败断言(RED):在修改生产代码之前,准确编写一个代表验收标准的失败测试。运行测试,并确认失败原因是预期的断言错误,而非语法或导入错误。
- 最小化实现(GREEN):只编写使失败测试通过所需的最少生产代码;禁止推测性功能、预先设计的抽象或未经测试的代码分支。
- 杜绝断言碰运气:针对具体的状态转换、返回数据或领域不变量进行断言;禁止浅层存在性断言(
expect(res).toBeDefined()、assert len(x) > 0)。 - 规范输出约定:(按设计省略——这是由模型调用的行为协议。其输出是生产代码和测试套件的差异。)
领域准则
1. Red-Green-Refactor 循环
- RED:编写一个捕获具体验收标准的测试用例。运行测试器以确认 RED 状态。
- GREEN:实现通过测试所需的最少逻辑。运行测试器和类型检查器以确认 GREEN 状态。
- REFACTOR:删去冗余变量,消除重复逻辑,并使命名符合领域语言,同时保持测试通过。
2. 不变量与属性检查
优先使用不变量测试,而非浅层示例测试:
- 有界性:对于任意输入,范围边界都必须成立(
0 <= discount <= total)。 - 幂等性:重复应用相同的变更会产生完全相同的结果状态。
- 往返一致性:序列化和反序列化领域实体后,深度相等性得以保留。
代码异味与改进方法
// Smell: Testing private internals (Couples test to implementation)
expect(service['internalCache'].has('item-123')).toBe(true);
// Remedy: Testing through public observable seam
const result = await service.fetchItem('item-123');
expect(result.id).toBe('item-123');
# Smell: Shallow assertion roulette (Passes even if data is corrupt)
assert response.status_code == 200
assert response.json() is not None
# Remedy: Concrete invariant assertion
assert response.status_code == 200
data = response.json()
assert data["order_id"] == expected_id
assert data["status"] == "CONFIRMED"
评论
支持 Markdown