Agent skill

TDD Workflow

by xu-xiang in xu-xiang/everything-claude-code-zh

在编写新功能、修复 Bug 或重构代码时使用此技能。强制执行测试驱动开发(TDD),包括单元测试、集成测试和端到端(E2E)测试,覆盖率需达到 80% 以上。

MITAuto-check passedTesting & QA

Install TDD Workflow

skills CLI
$ npx skills add xu-xiang/everything-claude-code-zh --skill tdd-workflow -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install xu-xiang/everything-claude-code-zh tdd-workflow --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/tdd-workflow .claude/skills/tdd-workflow && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tdd-workflow
GitHub stars
2k
Token cost
~1.8k tokens
SKILL.md length
173 words
Files
2
Skills in repo
78
Repo updated
First seen
Licence
MIT

At a glance

在编写新功能、修复 Bug 或重构代码时使用此技能。强制执行测试驱动开发(TDD),包括单元测试、集成测试和端到端(E2E)测试,覆盖率需达到 80% 以上。

  • Works in 3 steps: 先测试,后代码(Tests BEFORE Code) → 覆盖率要求 → 测试类型
  • Tasks that involve Test-driven development
  • SKILL.md covers 何时激活, 核心原则, TDD 工作流步骤 and 测试模式(Patterns), plus 4 more sections
  • Calls npm

What it does

TDD Workflow is an agent skill from xu-xiang/everything-claude-code-zh. 在编写新功能、修复 Bug 或重构代码时使用此技能。强制执行测试驱动开发(TDD),包括单元测试、集成测试和端到端(E2E)测试,覆盖率需达到 80% 以上。

Its SKILL.md is about 1.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).

It sits in Testing & QA, covering Test-driven development, End-to-end testing and Unit testing. The repository describes itself as: everything-claude-code 中文翻译项目:完整的 Claude Code 配置集合(agents, skills, hooks, commands, rules, MCPs)。源自 Anthropic 黑客松获胜者的实战配置,助力中文工程师高效理解与使用 Claude Code。 The licence is MIT.

When your agent uses it

  • Tasks that involve Test-driven development
  • Tasks that involve End-to-end testing
  • Tasks that involve Unit testing

Example prompts

  • “/tdd-workflow”

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. 先测试,后代码(Tests BEFORE Code)
  2. 覆盖率要求
  3. 测试类型

What it can do on your machine

Read from SKILL.md and the folder at commit dfbf946. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

TDD Workflow loads about 1.8k tokens when it runs. Until then it costs about 23 tokens; SKILL.md has 173 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~23
When it runs · the whole SKILL.md, loaded when a task matches
~1.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from xu-xiang/everything-claude-code-zh at commit dfbf946, republished under its MIT licence (© xu-xiang). 173 words, ~1,816 tokens.

Download SKILL.mdSave it as .claude/skills/tdd-workflow/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
tdd-workflow
description
在编写新功能、修复 Bug 或重构代码时使用此技能。强制执行测试驱动开发(TDD),包括单元测试、集成测试和端到端(E2E)测试,覆盖率需达到 80% 以上。
origin
ECC

测试驱动开发(TDD)工作流

此技能确保所有代码开发都遵循具有全面测试覆盖率的 TDD 原则。

何时激活

  • 编写新功能或新逻辑
  • 修复 Bug 或问题
  • 重构现有代码
  • 添加 API 端点
  • 创建新组件

核心原则

1. 先测试,后代码(Tests BEFORE Code)

务必先编写测试,然后编写代码使测试通过。

2. 覆盖率要求
  • 最低 80% 覆盖率(单元测试 + 集成测试 + E2E)
  • 覆盖所有边缘情况(edge cases)
  • 测试错误场景(error scenarios)
  • 验证边界条件(boundary conditions)
3. 测试类型
单元测试(Unit Tests)
  • 独立函数和工具方法
  • 组件逻辑
  • 纯函数
  • 辅助函数和工具
集成测试(Integration Tests)
  • API 端点
  • 数据库操作
  • 服务间交互
  • 外部 API 调用
端到端测试(E2E Tests - Playwright)
  • 关键用户流程
  • 完整工作流
  • 浏览器自动化
  • UI 交互

TDD 工作流步骤

第 1 步:编写用户旅程(User Journeys)
作为 [角色],我想 [操作],以便 [收益]

示例:
作为一名用户,我想进行语义化的市场搜索,
以便即使没有精确的关键词也能找到相关的市场。
第 2 步:生成测试用例

为每个用户旅程创建全面的测试用例:

typescript
describe('语义化搜索', () => {
  it('为查询返回相关的市场', async () => {
    // 测试实现
  })

  it('优雅地处理空查询', async () => {
    // 测试边缘情况
  })

  it('当 Redis 不可用时回退到子字符串搜索', async () => {
    // 测试回退行为
  })

  it('按相似度得分对结果进行排序', async () => {
    // 测试排序逻辑
  })
})
第 3 步:运行测试(预期失败)
bash
npm test
# 测试应该失败 - 我们还没有实现功能
第 4 步:实现代码

编写最少量的代码使测试通过:

typescript
// 由测试引导的实现
export async function searchMarkets(query: string) {
  // 实现代码
}
第 5 步:再次运行测试
bash
npm test
# 测试现在应该通过
第 6 步:重构(Refactor)

在保持测试通过的情况下提高代码质量:

  • 消除重复
  • 改进命名
  • 优化性能
  • 增强可读性
第 7 步:验证覆盖率
bash
npm run test:coverage
# 验证是否达到了 80% 以上的覆盖率

测试模式(Patterns)

单元测试模式 (Jest/Vitest)
typescript
import { render, screen, fireEvent } from '@testing-library/react'
import { Button } from './Button'

describe('Button 组件', () => {
  it('以正确的文本渲染', () => {
    render(<Button>Click me</Button>)
    expect(screen.getByText('Click me')).toBeInTheDocument()
  })

  it('点击时调用 onClick', () => {
    const handleClick = jest.fn()
    render(<Button onClick={handleClick}>Click</Button>)

    fireEvent.click(screen.getByRole('button'))

    expect(handleClick).toHaveBeenCalledTimes(1)
  })

  it('当 disabled 属性为 true 时被禁用', () => {
    render(<Button disabled>Click</Button>)
    expect(screen.getByRole('button')).toBeDisabled()
  })
})
API 集成测试模式
typescript
import { NextRequest } from 'next/server'
import { GET } from './route'

describe('GET /api/markets', () => {
  it('成功返回市场数据', async () => {
    const request = new NextRequest('http://localhost/api/markets')
    const response = await GET(request)
    const data = await response.json()

    expect(response.status).toBe(200)
    expect(data.success).toBe(true)
    expect(Array.isArray(data.data)).toBe(true)
  })

  it('验证查询参数', async () => {
    const request = new NextRequest('http://localhost/api/markets?limit=invalid')
    const response = await GET(request)

    expect(response.status).toBe(400)
  })

  it('优雅地处理数据库错误', async () => {
    // 模拟数据库失败
    const request = new NextRequest('http://localhost/api/markets')
    // 测试错误处理
  })
})
E2E 测试模式 (Playwright)
typescript
import { test, expect } from '@playwright/test'

test('用户可以搜索并过滤市场', async ({ page }) => {
  // 导航到市场页面
  await page.goto('/')
  await page.click('a[href="/markets"]')

  // 验证页面已加载
  await expect(page.locator('h1')).toContainText('Markets')

  // 搜索市场
  await page.fill('input[placeholder="Search markets"]', 'election')

  // 等待防抖和结果
  await page.waitForTimeout(600)

  // 验证显示的搜索结果
  const results = page.locator('[data-testid="market-card"]')
  await expect(results).toHaveCount(5, { timeout: 5000 })

  // 验证结果包含搜索词
  const firstResult = results.first()
  await expect(firstResult).toContainText('election', { ignoreCase: true })

  // 按状态过滤
  await page.click('button:has-text("Active")')

  // 验证过滤后的结果
  await expect(results).toHaveCount(3)
})

test('用户可以创建新市场', async ({ page }) => {
  // 首先登录
  await page.goto('/creator-dashboard')

  // 填写市场创建表单
  await page.fill('input[name="name"]', 'Test Market')
  await page.fill('textarea[name="description"]', 'Test description')
  await page.fill('input[name="endDate"]', '2025-12-31')

  // 提交表单
  await page.click('button[type="submit"]')

  // 验证成功消息
  await expect(page.locator('text=Market created successfully')).toBeVisible()

  // 验证重定向到市场详情页
  await expect(page).toHaveURL(/\/markets\/test-market/)
})

测试文件组织

src/
├── components/
│   ├── Button/
│   │   ├── Button.tsx
│   │   ├── Button.test.tsx          # 单元测试
│   │   └── Button.stories.tsx       # Storybook
│   └── MarketCard/
│       ├── MarketCard.tsx
│       └── MarketCard.test.tsx
├── app/
│   └── api/
│       └── markets/
│           ├── route.ts
│           └── route.test.ts         # 集成测试
└── e2e/
    ├── markets.spec.ts               # E2E 测试
    ├── trading.spec.ts
    └── auth.spec.ts

模拟(Mocking)外部服务

Supabase 模拟
typescript
jest.mock('@/lib/supabase', () => ({
  supabase: {
    from: jest.fn(() => ({
      select: jest.fn(() => ({
        eq: jest.fn(() => Promise.resolve({
          data: [{ id: 1, name: 'Test Market' }],
          error: null
        }))
      }))
    }))
  }
}))
Redis 模拟
typescript
jest.mock('@/lib/redis', () => ({
  searchMarketsByVector: jest.fn(() => Promise.resolve([
    { slug: 'test-market', similarity_score: 0.95 }
  ])),
  checkRedisHealth: jest.fn(() => Promise.resolve({ connected: true }))
}))
OpenAI 模拟
typescript
jest.mock('@/lib/openai', () => ({
  generateEmbedding: jest.fn(() => Promise.resolve(
    new Array(1536).fill(0.1) // 模拟 1536 维向量
  ))
}))

测试覆盖率验证

运行覆盖率报告
bash
npm run test:coverage
覆盖率阈值
json
{
  "jest": {
    "coverageThresholds": {
      "global": {
        "branches": 80,
        "functions": 80,
        "lines": 80,
        "statements": 80
      }
    }
  }
}

应避免的常见测试错误

❌ 错误:测试实现细节
typescript
// 不要测试内部状态
expect(component.state.count).toBe(5)
✅ 正确:测试用户可见的行为
typescript
// 测试用户看到的内容
expect(screen.getByText('Count: 5')).toBeInTheDocument()
❌ 错误:脆弱的选择器
typescript
// 容易因样式调整而失效
await page.click('.css-class-xyz')
✅ 正确:语义化选择器
typescript
// 对变化具有韧性
await page.click('button:has-text("Submit")')
await page.click('[data-testid="submit-button"]')
❌ 错误:缺乏测试隔离
typescript
// 测试之间相互依赖
test('creates user', () => { /* ... */ })
test('updates same user', () => { /* 依赖于前一个测试 */ })
✅ 正确:独立的测试
typescript
// 每个测试都设置自己的数据
test('creates user', () => {
  const user = createTestUser()
  // 测试逻辑
})

test('updates user', () => {
  const user = createTestUser()
  // 更新逻辑
})

持续测试

开发过程中的监听模式 (Watch Mode)
bash
npm test -- --watch
# 文件更改时自动运行测试
Pre-Commit 钩子
bash
# 每次提交前运行
npm test && npm run lint
CI/CD 集成
yaml
# GitHub Actions
- name: Run Tests
  run: npm test -- --coverage
- name: Upload Coverage
  uses: codecov/codecov-action@v3

最佳实践

  1. 先写测试 - 始终遵循 TDD
  2. 每个测试只做一个断言 - 专注于单一行为
  3. 描述性的测试名称 - 说明测试了什么
  4. 准备-执行-断言 (Arrange-Act-Assert) - 清晰的测试结构
  5. 模拟外部依赖 - 隔离单元测试
  6. 测试边缘情况 - Null, undefined, 空值, 大数据量
  7. 测试错误路径 - 不仅仅是成功路径
  8. 保持测试快速 - 每个单元测试 < 50ms
  9. 测试后清理 - 无副作用
  10. 检查覆盖率报告 - 识别缺口

成功指标

  • 达到 80% 以上的代码覆盖率
  • 所有测试通过(绿色)
  • 没有跳过或禁用的测试
  • 测试执行快速(单元测试 < 30s)
  • E2E 测试覆盖关键用户流程
  • 测试在上线前发现 Bug

记住:测试不是可选的。它们是安全网,能够让你自信地进行重构、快速开发并确保生产环境的可靠性。

© xu-xiang, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .agents/skills/tdd-workflow of xu-xiang/everything-claude-code-zh.

  • SKILL.md
  • agents/openai.yaml

Open the folder on GitHubat commit dfbf946

Compare with similar skills

TDD Workflow next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

TDD Workflow compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
TDD Workflow this skillxu-xiang/everything-claude-code-zh2k—~1.8kAutomated safety check: PassMIT
TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph11211 repos~2.4kAutomated safety check: PassNone
TDD Workflowaffaan-m/ECC276k2 repos~2kAutomated safety check: PassMIT
TDD Workflowaffaan-m/ECC276k2 repos~2.1kAutomated safety check: PassMIT
TDD Workflowaffaan-m/ECC276k1 repos~2.6kAutomated safety check: PassMIT
TDD Workflowaffaan-m/ECC276k—~3.6kAutomated safety check: PassMIT

Similar skills

  • TDD Workflow

    hellangleZ/burn-in-cceverywhere-ralph

    A skill your agent uses when writing new features, fixing bugs, or refactoring code.

    112 GitHub starsUsed in 11 repos~2.4k tokens
    Testing & QAAuto-check passed
  • TDD Workflow

    affaan-m/ECC

    新機能の作成、バグ修正、コードのリファクタリング時にこのスキルを使用します。ユニット、統合、E2Eテストを含む80%以上のカバレッジでテスト駆動開発を強制します。

    276k GitHub starsUsed in 2 repos~2k tokens
    Testing & QAAuto-check passed
  • TDD Workflow

    affaan-m/ECC

    새 기능 작성, 버그 수정 또는 코드 리팩터링 시 이 스킬을 사용하세요. An agent skill from affaan-m/ECC.

    276k GitHub starsUsed in 2 repos~2.1k tokens
    Testing & QAAuto-check passed
  • TDD Workflow

    affaan-m/ECC

    Yeni özellikler yazarken, hata düzeltirken veya kod refactor ederken bu skill'i kullanın.

    276k GitHub starsUsed in 1 repo~2.6k tokens
    Testing & QAAuto-check passed
  • TDD Workflow

    affaan-m/ECC

    Usar este skill al escribir nuevas funcionalidades, corregir bugs o refactorizar código.

    276k GitHub stars~3.6k tokensUpdated 4 days ago
    Testing & QAAuto-check passed
  • Odc Testing

    DouglasNeuroInformatics/OpenDataCapture

    Test a change in Open Data Capture. An agent skill from DouglasNeuroInformatics/OpenDataCapture.

    119 GitHub stars~1.5k tokensUpdated 2 days ago
    Testing & QAAuto-check: notes

More from xu-xiang/everything-claude-code-zh

All 78 skills in this repo
  • Configure Ecc

    xu-xiang/everything-claude-code-zh

    Everything Claude Code 的交互式安装程序 — 引导用户选择并安装技能和规则到用户级或项目级目录,验证路径,并可选择优化已安装文件。

    2k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check passed
  • Continuous Learning V2

    xu-xiang/everything-claude-code-zh

    基于本能(Instinct)的学习系统,通过钩子(hooks)观察会话,创建带有置信度评分的原子本能,并将其演化为技能(Skills)、命令(Commands)或智能体(Agents)。v2.1 版本增加了项目作用域(project-scoped)的本能,以防止跨项目污染。

    2k GitHub stars~2.1k tokensUpdated 7 mo ago
    Auto-check passed
  • API Design

    xu-xiang/everything-claude-code-zh

    生产级 API 的 REST API 设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和速率限制. An agent skill from xu-xiang/everything-claude-code-zh.

    2k GitHub stars~2.7k tokensUpdated 7 mo ago
    Auto-check passed
  • Backend Patterns

    xu-xiang/everything-claude-code-zh

    后端架构模式、API 设计、数据库优化以及适用于 Node.js、Express 和 Next.js API 路由的服务端最佳实践。

    2k GitHub stars~3.2k tokensUpdated 7 mo ago
    Auto-check passed
  • Backend Patterns

    xu-xiang/everything-claude-code-zh

    后端架构模式、API 设计、数据库优化以及 Node.js、Express 和 Next.js API 路由的服务端最佳实践。

    2k GitHub stars~3.1k tokensUpdated 7 mo ago
    Auto-check passed
  • Backend Patterns

    xu-xiang/everything-claude-code-zh

    后端架构模式、API 设计、数据库优化以及针对 Node.js、Express 和 Next.js API 路由的服务端最佳实践。

    2k GitHub stars~3.2k tokensUpdated 7 mo ago
    Auto-check passed

Categories

Questions about TDD Workflow

What does TDD Workflow do?

在编写新功能、修复 Bug 或重构代码时使用此技能。强制执行测试驱动开发(TDD),包括单元测试、集成测试和端到端(E2E)测试,覆盖率需达到 80% 以上。. TDD Workflow is an agent skill from xu-xiang/everything-claude-code-zh.

When should I use TDD Workflow?

TDD Workflow fits situations like: tasks that involve Test-driven development; tasks that involve End-to-end testing; tasks that involve Unit testing.

How do I install TDD Workflow in Claude Code?

Run `npx skills add xu-xiang/everything-claude-code-zh --skill tdd-workflow -a claude-code`. Or copy the skill folder (.agents/skills/tdd-workflow in xu-xiang/everything-claude-code-zh) into .claude/skills/tdd-workflow in your project. Claude Code loads it when a task matches its description.

How do I install TDD Workflow in Codex?

Run `npx skills add xu-xiang/everything-claude-code-zh --skill tdd-workflow -a codex`. Or copy the skill folder (.agents/skills/tdd-workflow in xu-xiang/everything-claude-code-zh) into .agents/skills/tdd-workflow in your project. Codex loads it when a task matches its description.

Can I use TDD Workflow in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add xu-xiang/everything-claude-code-zh --skill tdd-workflow -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tdd-workflow, .gemini/skills/tdd-workflow, .github/skills/tdd-workflow and .opencode/skills/tdd-workflow in your project.

What does TDD Workflow need to run?

Going by SKILL.md and its folder, TDD Workflow needs the command-line tools its instructions call (npm).

Does TDD Workflow access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is TDD Workflow safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does TDD Workflow use?

TDD Workflow is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does TDD Workflow use?

About 1.8k tokens (SKILL.md is roughly 7.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to TDD Workflow?

Skills that share tags, products or a category with TDD Workflow: TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), TDD Workflow (affaan-m/ECC, 276k stars), TDD Workflow (affaan-m/ECC, 276k stars) and TDD Workflow (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains TDD Workflow?

xu-xiang (a GitHub user) maintains it in xu-xiang/everything-claude-code-zh, which has 1,976 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on March 5, 2026.

Source: xu-xiang/everything-claude-code-zh on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.