mcpField
T
tdd

tdd

github.com/jellydn测试与质量12646 次安装4 天前更新
代码仓库

关于 tdd

一项引导开发者实践测试驱动开发的技能,覆盖从确认测试命令到完成 Red-Green-Refactor 循环。它强调行为测试、小步垂直切片,以及确认失败原因有效。

主要功能

  1. 01Red-Green-Refactor 工作流
  2. 02发现测试运行器
  3. 03编写聚焦的行为测试
  4. 04持续获取测试反馈
  5. 05查看测试状态与后续步骤

适用场景

  1. 01为新功能启动 TDD
  2. 02编写描述目标行为的测试
  3. 03实现通过测试所需的最少代码
  4. 04在测试保持通过时重构

安装

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

$npx skills add https://github.com/jellydn/my-ai-tools --skill tdd

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

附带文件templates/test-template.md

详细介绍

测试驱动开发(TDD)

通过 Red-Green-Refactor 循环,引导你完成完整的 TDD 工作流。

用法

/tdd <ACTION> [ARGUMENTS]

操作

  • start - 为某项功能初始化 TDD 会话
  • red <TEST_NAME> - 创建失败的测试(Red 阶段)
  • green - 运行测试并实现代码(Green 阶段)
  • refactor - 引导重构流程(Refactor 阶段)
  • cycle - 运行完整的 Red-Green-Refactor 循环
  • watch - 启动测试监视器,持续获取反馈
  • status - 显示当前测试状态和后续步骤

TDD 原则

Red-Green-Refactor 循环
  1. Red:编写一个失败的测试,用于定义期望的行为
  2. Green:编写最少量的代码,使测试通过
  3. Refactor:在保持测试通过的同时提升代码质量
最佳实践
  • 先编写测试——测试定义接口和行为
  • 小步前进——进行微小、渐进式的更改
  • 快速反馈——频繁运行测试,立即验证
  • 代码整洁——定期重构以保持质量
  • 每个测试只覆盖一个概念——让测试保持聚焦且原子化
  • AAA 模式——按照 Arrange、Act、Assert 的结构组织测试
  • 黑盒测试——只测试公共方法和行为,不测试实现细节
  • 在双方约定的接缝处测试——编写测试前,先确定暴露该行为的公共接口,并优先选择现有的最高层接缝
  • 独立的预期结果——预期值应来自字面值、实际推演示例或规范;不要用与实现相同的算法重新计算
  • 垂直切片——编写一个有意义的测试,实现最少代码,然后重复;避免在从第一个循环中获取经验前,就编写整套假想的测试
反模式
  • 与实现耦合的测试会模拟私有协作者或检查内部状态。它们会在无害的重构中失败,也无法提供充分的行为验证。
  • 同义反复的测试用与被测代码相同的逻辑推导预期值,因此两者可能同时出错。
  • 水平切片先编写所有测试,之后再编写所有实现。应优先采用示踪弹式切片,每次只验证一个用户可见的行为。
  • 未经确认的接缝仅仅因为容易访问就测试低层辅助函数。如果某行为在更高层的接口中更重要,就应在那里测试,或说明为什么低层接缝才是正确选择。

在第一个 Red 阶段之前,应从项目清单、任务运行器、文档或 CI 中查明仓库使用的测试运行器和命令。不要假定使用 TypeScript、Vitest、npm 或 pnpm。记录导致测试失败时所用的确切命令及失败原因;语法或导入错误不属于有效的 Red 状态。

流程

对于“start ”:
  1. 为该功能初始化 TDD 会话
  2. 创建或确定目标源文件
  3. 如果对应的测试文件不存在,则创建该文件
  4. 说明功能需求和验收标准
对于“red <TEST_NAME>”:
  1. 创建一个描述期望行为的失败测试
  2. 确保测试因正确原因失败(而非语法错误)
  3. 运行测试,确认处于 Red 状态
  4. 说明该测试验证的内容
对于“green”:
  1. 实现最少量的代码,使失败的测试通过
  2. 专注于让测试通过,而非追求完美代码
  3. 运行测试,确认处于 Green 状态
  4. 只编写足以通过测试的代码
对于“refactor”:
  1. 在保持测试通过的同时提升代码质量
  2. 消除重复并改进设计
  3. 重构过程中持续运行测试
  4. 每次只进行一项重构更改

测试模板

测试模板位于 $SKILL_PATH/templates/test-template.md:

import { describe, it, expect } from "vitest";
import { functionName } from "./module";

describe("functionName", () => {
	it("should return formatted output when given valid input", () => {
		// Arrange - Setup test scenario
		const input = "test input";
		const expectedOutput = "expected output";

		// Act - Execute the unit under test
		const result = functionName(input);

		// Assert - Verify expected outcome
		expect(result).toBe(expectedOutput);
	});
});

常用命令

  • 运行测试:npm test 或 pnpm test
  • 监视模式:npm test --watch
  • 使用覆盖率:npm test --coverage

评论

支持 Markdown