mcpField
T
tdd

tdd

github.com/kimny1143测试与质量66 次安装
代码仓库

关于 tdd

用于执行测试驱动开发流程的技能,适合在新增功能或修复缺陷时指导开发。它按 RED、GREEN、REFACTOR 阶段推进,并提供测试设计与检查清单。

主要功能

  1. 01按 RED、GREEN、REFACTOR 推进
  2. 02覆盖正常、边界与错误场景
  3. 03提供 Vitest、Jest 和 Playwright 命令
  4. 04包含测试命名与完成检查清单

适用场景

  1. 01从测试开始实现新功能
  2. 02编写可复现缺陷的测试
  3. 03为边界与错误情况补充测试

安装

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

$npx skills add https://github.com/kimny1143/claude-code-template --skill tdd

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

详细介绍

来自项目 README

/tdd - Test-Driven Development

テスト駆動開発ワークフローを実行する。

使い方

/tdd                    # 対話的にTDDを開始
/tdd UserService        # UserServiceのテストから開始
/tdd handlePayment edge # handlePaymentのエッジケーステスト

TDDサイクル

┌─────────────────────────────────────────────────┐
│  1. RED    → テストを書く(失敗することを確認) │
│  2. GREEN  → 最小限のコードで通す               │
│  3. REFACTOR → リファクタ(テストは通ったまま)│
└─────────────────────────────────────────────────┘

ワークフロー

Step 1: RED(テストを書く)
  1. テスト対象を特定

    • 新機能: 期待する入出力を定義
    • バグ修正: バグを再現するテストを書く
  2. テストファイルを作成/更新

    // tests/unit/services/user.service.test.ts
    describe('UserService', () => {
      describe('createUser', () => {
        it('should create user with valid data', async () => {
          const result = await userService.createUser({
            email: '[email protected]',
            name: 'Test User',
          });
          expect(result.id).toBeDefined();
          expect(result.email).toBe('[email protected]');
        });
    
        it('should throw error for duplicate email', async () => {
          // エッジケース
          await expect(
            userService.createUser({ email: '[email protected]', name: 'Test' })
          ).rejects.toThrow('Email already exists');
        });
      });
    });
    
  3. テスト実行 → 失敗を確認

    npm run test -- --watch tests/unit/services/user.service.test.ts
    
Step 2: GREEN(実装する)
  1. 最小限の実装で通す

    • 完璧を目指さない
    • ハードコードでもOK(後でリファクタ)
    • テストが通ることだけに集中
  2. テスト実行 → 成功を確認

Step 3: REFACTOR(改善する)
  1. テストが通った状態で:

    • 重複を排除
    • 命名を改善
    • 構造を整理
  2. テスト実行 → まだ通ることを確認

  3. 満足したら次のテストへ(Step 1に戻る)


テストの書き方ガイド

命名規則
describe('[対象]', () => {
  describe('[メソッド/機能]', () => {
    it('should [期待する動作] when [条件]', () => {
      // ...
    });
  });
});
カバーすべきケース
ケース例
正常系有効な入力で期待通り動作
境界値0, 空文字, 配列の最初/最後
エラー系無効な入力、null/undefined
エッジケース並行アクセス、タイムアウト
モックの使い方
// 外部依存はモック
vi.mock('@/db', () => ({
  db: {
    select: vi.fn().mockReturnValue({
      from: vi.fn().mockReturnValue({
        where: vi.fn().mockResolvedValue([{ id: '1', name: 'Test' }]),
      }),
    }),
  },
}));

テストコマンド例

Vitest
npm run test                           # 全テスト
npm run test -- --watch               # ウォッチモード
npm run test -- tests/unit/specific   # 特定ディレクトリ
npm run test -- --coverage            # カバレッジ
Jest
npm test                              # 全テスト
npm test -- --watch                   # ウォッチモード
npm test -- --coverage                # カバレッジ
Playwright (E2E)
npm run test:e2e                      # 全E2E
npx playwright test --grep "login"    # 特定テスト

チェックリスト

TDD完了時の確認:

  • テストが先に書かれた(実装より前)
  • テストが一度失敗した(REDフェーズ)
  • 最小限の実装で通した(GREEN)
  • リファクタ後もテストが通る
  • エッジケースがカバーされている
  • テスト名が動作を説明している

评论

支持 Markdown