注目
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.md | TDD ルールを定義 |
| Hooks | 自動テスト実行 |
| Stop Hook | テストが通ることを強制 |
次のステップ
TDD ワークフローをマスターしたら、推奨される次の読み物:
- Hooks 完全チュートリアル - より多くの自動化設定
- Custom Agents - 専用のテスト Agent を作成
- Director Mode - 高度な開発モード
リソース
最終更新:2026-01-19