メインコンテンツへスキップ
注目 TDD Testing Workflow Automation

Claude Code TDD ワークフロー:AI 支援テスト駆動開発完全ガイド

Claude Code で TDD を実装する方法を学びます。Red-Green-Refactor の完全なプロセス、Hooks 自動化設定、CLAUDE.md セットアップ例を含みます。

2026年1月19日 10 min read 著者:Claude World

TDD(テスト駆動開発)は Anthropic が公式に推奨する Claude Code ワークフローの1つです。この記事では、Claude に Red-Green-Refactor サイクルを自動的に従わせ、より高品質なコードを書く方法を教えます。


なぜ TDD + Claude Code?

Claude Code は明確な目標を持つタスクが得意です。テストが最高の目標です:

従来:コードを書く → 手動テスト → バグ発見 → 修正 → 繰り返し

TDD:テストを書く → テスト失敗(赤) → コードを書いてテストを通す(緑) → リファクタリング

Claude + TDD の利点

利点説明
明確な成功基準テストが通る = タスク完了
自動イテレーションClaude がテストを実行し、結果を見て、修正できる
やり取りが減る「うまくいった?」の手動確認が不要
コード品質自然にテストカバレッジがある

TDD の基本:Red-Green-Refactor

3つのフェーズ

┌─────────────────────────────────────────────────────────┐
│                                                         │
│    🔴 RED          🟢 GREEN         🔄 REFACTOR        │
│                                                         │
│    失敗する       最小のコードで    コードを改善       │
│    テストを書く   テストを通す      テストは通したまま │
│                                                         │
│         │              │               │               │
│         ▼              ▼               ▼               │
│    テストは失敗    テストは通る     テストはまだ通る  │
│                                                         │
└─────────────────────────────────────────────────────────┘

実践例

ステップ1:赤(Red)

あなた:add(2, 3) が 5 を返すことを検証するテストを書いて

Claude:
// add.test.js
test('add(2, 3) should return 5', () => {
  expect(add(2, 3)).toBe(5);
});

// テスト実行
npm test
// ❌ FAIL - add is not defined

ステップ2:緑(Green)

あなた:テストを通して

Claude:
// add.js
function add(a, b) {
  return a + b;
}

// テスト実行
npm test
// ✅ PASS

ステップ3:リファクタリング(Refactor)

あなた:コードをリファクタリングして、型チェックを追加して

Claude:
// add.ts
function add(a: number, b: number): number {
  return a + b;
}

// テスト実行
npm test
// ✅ PASS(テストはまだ通る)

CLAUDE.md 設定

基本 TDD ルール

プロジェクトルートの CLAUDE.md に追加:

# TDD 開発ルール

## コア原則
1. **テストファースト**:新機能は必ず失敗するテストから
2. **最小実装**:テストを通すのに必要な最小のコードのみ書く
3. **継続的リファクタリング**:緑になるたびにリファクタリングを検討

## 開発フロー
1. 要件を受け取る → まずテストを書く
2. テストが失敗することを確認(赤)
3. テストを通す最小のコードを書く(緑)
4. リファクタリング(緑を保つ)
5. 繰り返し

## 禁止事項
- ❌ テストなしで機能コードを書かない
- ❌ 既存のテストを削除またはスキップしない
- ❌ 「テストは後で」のコードを書かない

Hooks 自動化設定

自動テスト実行

コード変更後に自動でテストを実行:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npm test -- --passWithNoTests --watchAll=false 2>/dev/null",
            "onFailure": "warn"
          }
        ]
      }
    ]
  }
}

TDD 強制:テストが通らないと完了できない

{
  "hooks": {
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "npm test -- --passWithNoTests",
            "onFailure": "block"
          }
        ]
      }
    ]
  }
}

完全な TDD Hook 設定

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "prompt",
            "prompt": "機能コードを書いているかチェックしてください。もしそうなら、対応するテストファイルが存在するか確認してください。テストが存在しない場合、先にテストを書くよう促してください。'approve' またはリマインダーメッセージを返してください。"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npm test -- --passWithNoTests --watchAll=false",
            "onFailure": "warn"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "prompt",
            "prompt": "チェック:1) 機能コードが追加または変更されましたか?2) もしそうなら、対応するテストが存在し、通っていますか?テストが存在しないか失敗している場合、'block' を返して説明してください。そうでなければ 'approve' を返してください。"
          },
          {
            "type": "command",
            "command": "npm test",
            "onFailure": "block"
          }
        ]
      }
    ]
  }
}

実践例:Todo アプリ

TDD 方式でシンプルな Todo 機能を実装しましょう。

ステップ1:要件定義

要件:TodoList クラスを実装
- addTodo(text): Todo アイテムを追加
- getTodos(): すべての Todo を取得
- completeTodo(id): 完了としてマーク
- getCompletedCount(): 完了数を取得

ステップ2:最初のテスト(赤)

あなた:TDD 方式で TodoList を実装して。最初のテストを書いて:Todo アイテムを追加。

Claude が生成:

// todoList.test.js
const { TodoList } = require('./todoList');

describe('TodoList', () => {
  describe('addTodo', () => {
    test('should add a todo item', () => {
      // Arrange
      const todoList = new TodoList();

      // Act
      todoList.addTodo('牛乳を買う');

      // Assert
      const todos = todoList.getTodos();
      expect(todos).toHaveLength(1);
      expect(todos[0].text).toBe('牛乳を買う');
    });
  });
});

テスト実行:

npm test
# ❌ FAIL - Cannot find module './todoList'

ステップ3:最小実装(緑)

あなた:テストを通して、最小のコードを書いて。

Claude が生成:

// todoList.js
class TodoList {
  constructor() {
    this.todos = [];
  }

  addTodo(text) {
    this.todos.push({ text });
  }

  getTodos() {
    return this.todos;
  }
}

module.exports = { TodoList };

テスト実行:

npm test
# ✅ PASS

TDD FAQ

Q: TDD が適さない場合は?

A:

  • 探索的プロトタイプ(何を作るか不明)
  • UI スタイル調整
  • 設定ファイルの変更

これらの場合、先にコードを書いて、後でテストを追加できます。

Q: テストはどれくらい詳細に?

A: テストピラミッドに従う:

      /\
     /  \     E2E(少)
    /----\
   /      \   統合テスト(中)
  /--------\
 /          \ ユニットテスト(多)

Q: Claude がテストをスキップして直接コードを書く?

A: プロンプトで明示的に指示:

あなた:TDD 方式でこの機能を実装して。
    ステップ1:まず失敗するテストを書く
    ステップ2:テストが失敗することを確認した後、コードを書く

または Hooks で強制:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "prompt",
            "prompt": "機能コード(テストではない)を書いている場合、テストファイルが存在するか確認してください。存在しない場合、'block' を返して先にテストを書くよう促してください。"
          }
        ]
      }
    ]
  }
}

ベストプラクティスまとめ

1. プロンプトテンプレート

TDD 方式で [機能説明] を実装して:
1. まず失敗するテストを書く
2. テストが失敗することを確認した後、テストを通す最小のコードを書く
3. すべてのテストが通ったら、リファクタリングを検討

2. チェックリスト

新機能ごとに:

  • まずテストを書く
  • テストが失敗することを確認(赤)
  • テストを通すコードを書く(緑)
  • リファクタリング(緑を保つ)
  • カバレッジを確認

3. 推奨設定の組み合わせ

ツール用途
CLAUDE.mdTDD ルールを定義
Hooks自動テスト実行
Stop Hookテストが通ることを強制

次のステップ

TDD ワークフローをマスターしたら、推奨される次の読み物:

  1. Hooks 完全チュートリアル - より多くの自動化設定
  2. Custom Agents - 専用のテスト Agent を作成
  3. Director Mode - 高度な開発モード

リソース


最終更新:2026-01-19