tdd-workflow
测试驱动开发(TDD)流程规范——Red / Green / Refactor 三步循环、测试先行铁律、测试粒度与命名约定。当实现新功能、修复 bug 或重构时触发。 触发词:TDD、测试驱动、Red-Green-Refactor、测试先行、failing test、kata。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
测试驱动开发(TDD)流程规范——Red / Green / Refactor 三步循环、测试先行铁律、测试粒度与命名约定。当实现新功能、修复 bug 或重构时触发。 触发词:TDD、测试驱动、Red-Green-Refactor、测试先行、failing test、kata。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
用 citty + @clack/prompts 构建 Node.js CLI 的端到端工作流,覆盖命令路由、参数 schema、 终端交互、异步任务 UI 与 ESM 发布。触发词:citty、clack、prompts、CLI、命令行、子命令、 交互式、spinner、defineCommand、runMain、ESM 发布。
构建、扩展或调试 CodeMirror 6 浏览器代码编辑器,覆盖状态事务、扩展原语、 装饰、Compartment、语言包、补全诊断、主题、React 集成与 CM5→CM6 迁移。 触发词:CodeMirror 6、CM6、@codemirror/、EditorView、StateField、 Lezer、@uiw/react-codemirror。
使用 @pierre/diffs 与 @pierre/trees 构建代码审查、PR 视图、IDE 文件树、Merge Conflict 解决器。 覆盖 React/Vanilla API、虚拟化、Worker Pool、SSR、Shadow DOM 主题、CodeMirror 集成。 触发词:pierre、diff 渲染、文件树、PR 视图、merge conflict。
GitHub 仓库运营 + npm 包 tag 触发发布的一体化工作流。覆盖 issue/PR 分诊、CI 排障、 安全告警,以及 npm publish(provenance / scoped)+ 自动 GitHub Release(CHANGELOG 段落注入)。 触发词:github、gh、release、publish、tag、npm、provenance、changelog、triage、ci broken、版本发布。
为长跑 AI Coding 任务(Codex /goal、Claude Code、Cursor、Kiro autopilot)构建可审计、 不假完成、抗漂移的提示词。激活后先澄清需求、自动加载 AGENTS.md / 当前 spec / lessons.md, 再产出 5 段式 goal 与长跑健康守则。触发词:goal、写 goal、长任务、长跑、ralph。
使用 Mantine 组件库构建 React UI。涵盖核心组件选型、主题定制、Styles API、 布局模式、表单处理、日期选择器、图表、日程组件、通知系统、模态框管理、 Spotlight 搜索、文件上传、轮播、富文本编辑与 50+ hooks。 触发词:Mantine、UI 组件、主题配置、Styles API、DatePicker、Schedule、 Heatmap、通知、模态框、表单布局、Spotlight、Dropzone、Carousel、hooks。
| name | tdd-workflow |
| type | testing-strategy |
| description | 测试驱动开发(TDD)流程规范——Red / Green / Refactor 三步循环、测试先行铁律、测试粒度与命名约定。当实现新功能、修复 bug 或重构时触发。 触发词:TDD、测试驱动、Red-Green-Refactor、测试先行、failing test、kata。 |
| version | 1.0.0 |
| author | specforge |
先有一个失败的测试,才能写生产代码。 每次写生产代码前,必须能指出「我正在让哪个测试变绿」。
TDD 不是测试技术,是设计技术。它用测试的视角逼迫你先想清楚「输入 / 输出 / 可观测行为」,再决定如何实现。
循环周期:一次 Red→Green→Refactor 建议 5-15 分钟。超过 30 分钟仍没到 Green,说明步子迈太大,回退。
| 层级 | 特征 | 占比 | 执行时间 |
|---|---|---|---|
| 单元测试 | 纯函数 / 单一模块;无 I/O 依赖 | 60-70% | 毫秒级 |
| 集成测试 | 跨模块 / 含真实数据库或消息队列 | 20-30% | 秒级 |
| 端到端测试 | 完整流程通过公开入口调用 | 5-10% | 数十秒级 |
经验法则:TDD 主要在单元和集成层面展开。E2E 测试更适合用作已完成功能的回归保险,而非驱动设计。
given_when_then 或 should_whenshould_returnEmptyList_whenInventoryIsEmptygiven_expiredToken_when_authenticate_then_throwUnauthorizedit('should calculate total with tax when cart has items', () => {
// Arrange
const cart = new Cart();
cart.add({ price: 100, qty: 2 });
// Act
const total = cart.totalWithTax(0.1);
// Assert
expect(total).toBe(220);
});
原则:一个测试只断言一个行为。如果需要多个 expect,它们应当描述同一事实的不同侧面。
TDD 铁律在以下情境可放宽(但必须记录):
| 情境 | 替代做法 |
|---|---|
| 原型 / spike / 可行性验证 | 丢弃代码后重新用 TDD 实现 |
| 已有大量遗留代码 | 用「Characterization Test」锁定当前行为后再改 |
| UI 像素级微调 / CSS 样式 | 可视化验证为主 |
| 纯配置 / 静态模板 | 集成测试覆盖即可 |
禁止豁免:「我很熟这块」「赶时间」「先写完再补」——这些不是理由,是后悔的开始。
在 SpecForge 流程中,TDD 对应 implementation 阶段的硬门禁:
rules.implementation.hardGates 要求「禁止在测试之前编写生产代码」。rules.quality.verification)必须来自真实运行的测试命令输出。| 能力 | Java | Python | Go | Node.js |
|---|---|---|---|---|
| 单元测试框架 | JUnit 5 + AssertJ | pytest | 内置 testing | Vitest / Jest |
| Mock / Stub | Mockito | unittest.mock / pytest-mock | gomock / testify/mock | vi.mock / jest.mock |
| 参数化 | @ParameterizedTest | @pytest.mark.parametrize | Table-driven test | it.each() |
| 覆盖率 | JaCoCo | coverage.py | 内置 -cover | c8 / istanbul |
| 断言风格 | AssertJ fluent | 内置 assert | testify/assert | Vitest expect |
具体运行命令见 skills/workflow-steps/language-adapters/ 中对应语言的适配器。
| 反模式 | 问题 | 修正 |
|---|---|---|
| 先写生产代码再补测试 | 测试对齐实现而非需求,设计反馈丢失 | 回到 Red 阶段,先写测试再重做实现 |
| 一个测试断言太多行为 | 失败信息难以定位原因 | 按行为拆分多个测试 |
| 过度使用 mock | 测试锁定实现,重构就崩 | 用真实依赖或轻量 fake,减少对 mock 依赖 |
| 忽略 refactor 阶段 | 技术债持续累积 | Green 后立即执行 refactor 步骤 |
| 测试互相依赖顺序 | 并行化或跳过单个测试就全红 | 每个测试独立建立 / 清理状态 |
| 测试套件几十秒运行 | 反馈周期长,TDD 难以为继 | 单元测试控制在秒级,集成测试另行标签 |
pnpm test 或语言适配器对应命令)。