TDD Architect
t-wada(和田卓人)氏のTDD哲学に基づいたテスト駆動開発ガイド。
TDDサイクル
code
┌─────────────────────────────────────────┐ │ │ │ ┌───────┐ ┌───────┐ ┌────────┐ │ │ │ RED │ → │ GREEN │ → │REFACTOR│ │ │ └───────┘ └───────┘ └────────┘ │ │ ↑ │ │ │ └──────────────────────────┘ │ │ │ └─────────────────────────────────────────┘
Phase 1: RED - 失敗するテストを書く
目的: 実装すべき振る舞いを明確にする
- •一つの振る舞いだけをテストする
- •テスト名で意図を明確に表現する
- •Arrange-Act-Assert構造で書く
- •テストを実行し、失敗することを確認する
code
// 命名規則: "should [期待する振る舞い] when [条件]"
it('should return sum when adding two positive numbers')
it('should throw error when input is negative')
Phase 2: GREEN - 最小限のコードで通す
目的: テストを通す最もシンプルなコードを書く
- •過剰な実装をしない(YAGNI)
- •ハードコードでも良い(後でリファクタする)
- •テストが通ったら即座に次へ進む
- •設計の美しさは後回し
Phase 3: REFACTOR - コードを整理する
目的: テストを Green に保ちながらコードを改善する
- •テストは変更しない(振る舞いは変えない)
- •重複を除去する
- •命名を改善する
- •小さなステップで進める
- •各ステップ後にテストが通ることを確認
テスト構造 (Arrange-Act-Assert)
code
// Arrange (Given) - 準備: テスト対象とデータを用意 const calculator = new Calculator(); const a = 1, b = 2; // Act (When) - 実行: テスト対象の操作を1つだけ実行 const result = calculator.add(a, b); // Assert (Then) - 検証: 期待する結果を検証 expect(result).toBe(3);
ワークフロー判断
新機能の実装
- •最も単純なケースのテストを書く(RED)
- •通す(GREEN)
- •次のケースのテストを追加(RED)
- •通す(GREEN)
- •リファクタリング(REFACTOR)
- •繰り返す
バグ修正
- •バグを再現するテストを書く(RED)
- •テストが失敗することを確認
- •バグを修正(GREEN)
- •必要ならリファクタリング(REFACTOR)
リファクタリング
- •既存のテストが全て通ることを確認
- •小さな変更を加える
- •テストを実行して通ることを確認
- •繰り返す
- •リファクタリング中は新しいテストを追加しない
避けるべきアンチパターン
- •テストなしでコミット: 必ずテストを先に書く
- •複数のことを1テストで検証: 1テスト1アサーション原則
- •実装の詳細をテスト: 振る舞い(入力→出力)をテストする
- •テスト間の依存: 各テストは独立して実行可能に
- •過剰なモック: 本物を使えるなら本物を使う
詳細リファレンス
より詳細なTDD原則については references/tdd-principles.md を参照。