CTS-KB

開発手法ガイド:TDD 編 — AI エージェント時代の「superpower」

⏱ 約 10 分で読めます
#開発手法 #TDD #テスト駆動開発 #AI駆動開発 #Canon TDD #Kent Beck

🤖 AI 駆動開発で TDD が必要な理由

TDD は AI エージェント時代の「superpower」である — Kent Beck(XP / TDD の生みの親、2024)

TDD(Test-Driven Development)は 2003 年に Kent Beck が書籍『Test-Driven Development: By Example』で体系化した手法。それから 20 年以上経った 2024 年、 Kent Beck 自身が「AI エージェントと TDD の組み合わせで再びプログラミングに興奮している」と語って再評価が広まりました

なぜ今、TDD なのか? — それは AI 駆動開発が抱える本質的な不安「動くように見えるけど、本当に正しい?」を、構造的に解消できる唯一の手段 だからです。

TDD なし vs TDD あり — AI 駆動開発の景色が変わる

観点TDD なし AI 駆動開発TDD あり AI 駆動開発
AI 出力の検証目視レビューで「動きそう」を確認テストで Red/Green が秒で判定
AI が暴走したときどこから壊れたか分からない直近の Green に戻すだけ
仕様の伝達自然言語で曖昧に伝わるテストが「動く仕様書」になる
並列タスク1 件ずつしか怖くて回せない複数を並列で回しても安全
ライブラリ更新影響範囲が予測不能テスト全実行で即検出
設計の健全性後になって気づく書きやすさが即フィードバック
AI への信頼度「祈り」「事実」

TDD なしの AI 駆動開発は、ブレーキのない車で高速道路に出るのと同じ 。速いが、いつ事故るか分からない。TDD は速度を落とすブレーキではなく、 安心して全力で踏める安全装置 です。

TDD が AI 駆動開発で発揮する 5 つの効用

#効用TDD がもたらす状態効果
1AI 出力の即時検証Red → Green サイクルAI 提案の Yes/No が秒で決まる
2仕様の精密伝達テストが「動く仕様書」「何を作るか」を AI に渡す手段
3暴走からの即復旧各テストが「ここまで動く」を保証直近の Green コミットに戻すだけ
4並列タスクの安全性全テスト 1 コマンドで実行AI に複数タスクを並列実行できる
5設計品質のリアルタイム計測テストの書きやすさが即フィードバック設計の腐敗を早期検知

これらは「あれば便利」レベルの話ではありません。 AI 駆動開発の生産性そのものを桁違いに引き上げる加速装置 です。

Kent Beck が「再びプログラミングに興奮している」理由

Kent Beck(XP / TDD / Tidy First の生みの親)は、AI エージェントと TDD の出会いについて The Pragmatic Engineer で次のように語っています:

AI エージェントは「動くように見える」コードを大量に出してくる。 テストがなければそれを検証する手段がない 。TDD は AI エージェントの提案を即座に Red/Green で判定できる、AI 時代に再発見された 超能力 だ。

つまり TDD は AI 時代のために発明されたかのような 手法であり、長年 TDD を提唱してきた Kent Beck 自身が、その威力に「再びプログラミングに興奮している」と公言するほど。

これまで「TDD は学習コストが…」と敬遠されてきた現場でも、 AI 駆動開発を本気でやるなら TDD は前提条件 という認識が急速に広がっています。

テストが書けるかどうか = 疎結合の判定基準

TDD のもうひとつの本質は、 テストの書きやすさが、そのまま設計の健全性を表す ことです。

状況何を意味するか
テストが書ける疎結合である証拠 。依存をモック・スタブに差し替え可能。AI に任せられる
テストが書けない密結合である証拠 。依存を分離できない・副作用が制御できない・I/O が直接埋め込まれている

AI 駆動開発でこの判定が決定的に重要なのは、 「テストが書けないコード = AI 生成コードを検証できないコード」 だからです。検証できなければ、AI の出力を信じる根拠がなくなります。

テストが書けない設計は、AI 駆動開発に耐えない設計です。

「テストが書きにくい」と感じたら、それは設計の悲鳴。テストを諦めて手で書くのではなく、 設計を見直すサイン として受け取ってください(SOLID 編ヘキサゴナルアーキテクチャ が処方箋になります)。

本記事は開発手法ガイド:概要のシリーズ 5 本目。Canon TDD(2024 年の再整理)と AI 駆動開発での実践を中心に解説します。

📜 TDD の誤解を解く

「テストから書く」は手段であって目的ではない

TDD の本質は 「テストを先に書くこと」ではなく、「仕様を深く理解すること」 。テストが書けない = 仕様が曖昧、または設計に問題がある、というシグナルとして TDD を使う。

AI 駆動開発で TDD が効くのも、先に仕様を確定させるから。AI に「何を作るか」を渡す前にテストを書くと、自分の頭の中の曖昧さが一気に炙り出される。

「カバレッジ 100%」は目的ではない

TDD は 設計手法 であって、カバレッジ計測ツールではない。100% カバレッジのテストスイートでもバグは起きる。一方、カバレッジが低くても TDD で書かれたテストは「業務上の意味を持つ」ことが多い。

🔄 Canon TDD(2024 年版)

Kent Beck が 2024 年に Canon TDD で整理した「TDD の正統派」の手順:

1. テスト一覧を書く(このタスクで検証すべきシナリオ)
2. 一覧から 1 項目を選び、実行可能なテストに変換する
3. テストを実行して失敗を確認(Red)
4. コードを変更してテストを通す(Green)
5. 必要なら内部設計を整理する(Refactor)
6. テスト一覧に項目が残っていれば 2 に戻る

従来の「Red-Green-Refactor」との違い

従来の図式だけだと 「どんなテストを書くか」の合意が欠けていた 。Canon TDD は最初に テスト一覧 を書くステップを明示することで、スコープを固定する。

従来:
  Red → Green → Refactor → Red → Green → Refactor → ...
  (何のテストを書くかは都度考える)

Canon TDD:
  テスト一覧作成

  1 項目選択 → Red → Green → Refactor

  1 項目選択 → Red → Green → Refactor

  ...
  (全項目が終わればタスク完了)

AI 駆動開発では 「テスト一覧」こそ AI への最初の指示 として使える。

🧪 AI 駆動開発での TDD 実践

ステップ 1: テスト一覧を AI と一緒に作る

実装の前に、AI に「このタスクで検証すべきシナリオを一覧化して」と依頼する。

指示例:
  タスク: Order 集約に期間限定キャンペーンの適用機能を追加する。
  このタスクで検証すべきテストシナリオを一覧化してほしい。
  境界値・エラーケース・タイムゾーン・0 件のケースも含めて。

AI は境界値や異常系を見つけるのが得意な一方で、 業務上の重要ケース は漏らすことがある。人間が「このケースは必須」と追加する。

ステップ 2: 1 項目ずつテストを実装してもらう

指示例:
  テスト一覧の #3「キャンペーン期間外では割引されない」を
  Jest のテストとして実装してください。
  プロダクションコードはまだ書かないでください。

テストだけ書かせて、まず失敗することを確認する(Red)。

ステップ 3: プロダクションコードを書かせる

指示例:
  上のテストだけを通すように、Order.applyCampaign() を実装してください。
  他のテストケースのための先回り実装は避けてください。

「先回り実装禁止」を明示することで、AI が過剰に複雑な実装を出すのを防ぐ。

ステップ 4: リファクタリングを任せる

テストが Green になった状態で、AI にリファクタリングを依頼する。 テストがあるから安心して任せられる のが TDD の核心。

✅ テスト網羅性チェックリスト

AI にテストケースを考えさせる前に、自分で以下を把握しておく。AI は「網羅的に」と指示しても抜けがあるので、人間のチェック軸として機能させる。

必須テストケース
booleantruefalse の両方
enum / union全ての値
number0, 正数, 負数, 境界値
string空文字, 通常値, 特殊文字
array空配列, 1 件, 複数件
Date / 日付月末(28, 29, 30, 31 日), うるう年(2/28, 2/29), 年跨ぎ(12/31→1/1), タイムゾーン
null / undefinednullable 型の境界
並行性楽観ロック競合・二重実行
国際化日本語・英語・記号・絵文字

🎯 AI 駆動開発での TDD がうまくいく条件

1. テストが「仕様書」として読めること

AI に生成させたテストが expect(result.x).toBe(true) のように値だけ検証していると、意図が伝わらない。業務語彙で書く。

悪い: expect(result.status).toBe("OK");

良い: expect(result.isOrderAcceptable()).toBe(true);

2. テストが高速であること

AI とのサイクルを素早く回すには、1 テスト数 ms で終わる単体テストが主役。リポジトリパターンでインメモリ実装に差し替えれば、DB 起動なしで回せる。

3. テストが独立していること

テスト間に依存があると、AI が 1 箇所を変えるたびに関係ない箇所が壊れる。各テストは自前でセットアップ・後始末する。

⚠️ AI 駆動開発 × TDD のアンチパターン

1. テストコードを AI に丸投げするときの 2 つの規律

実務では テストコードも AI に書かせる のが現実です。問題は「丸投げ」自体ではなく、 守るべき規律を外したまま丸投げすること 。次の 2 つを守れば、AI に書かせても TDD の効果は失われません。

規律 1: 実装より先に書く(Test First)

実装の後にテストを書かせると、プロダクションコードに合わせた 「常に通るテスト」 になりがちです。順序を逆にするだけで意味が変わります。

× 実装 → テスト   (テストが実装の後追い → 仕様ではなく実装を検証)
○ テスト → 実装   (テストが仕様 → 実装が仕様を満たすかを判定)

AI への指示で順序を明示する型:

1. まず テストだけ 書いて(プロダクションコードはまだ書かない)
2. テストを実行して Red を確認
3. その上で プロダクションコード を実装して
4. テストを実行して Green を確認

「Red を確認させる」ステップが重要。実装ありきで書かれたテストは、 そもそも Red にならない のですぐ気づけます。

規律 2: カバレッジを常に高く保つ

AI がコードを量産する速度に、テスト追加が追いつかないと カバレッジが急速に低下 します。低下したまま進めると、 テストでカバーされていない箇所が AI の次の暴走で破壊 されても検出できません。

状態リスク
カバレッジ 80%+ 維持AI の暴走を即検知できる
カバレッジ 50% 以下に低下半分の機能は祈りで運用
カバレッジ低下を放置数週間後に「動かない箇所がどれか分からない」状態に

CI に組み込むべき仕組み:

  • PR ごとに カバレッジ低下を CI で検知jest --coverage + threshold / coverlet + threshold)
  • カバレッジが下がる PR は 自動却下明示承認制
  • 新規コードは 必ずテストとセットでコミット (AI への指示・hooks にも明記)

「テスト一覧」だけは人間が握る

AI に丸投げしてよい範囲と、人間が握るべき範囲を分離するのが鍵:

担当内容
人間テスト一覧を作る(業務シナリオ・境界値・例外パスの網羅性を判断)
AI各テストの実装、対応するプロダクションコードの生成
人間テスト一覧の網羅性とプロダクションコードの設計をレビュー

「網羅的にテスト書いて」と AI に任せると、業務上重要なケースが漏れます。 テスト一覧(何をテストするか)は人間が握る が原則。実装作業(どう書くか)は AI に任せて OK です。

2. モックを過剰に使う

AI は外部依存をモックで埋めるのが得意。ただし全部モックにすると「テストは通るが本物では壊れる」状態になる。 境界(DB、外部 API)だけモックし、内部はリアル呼び出し が基本。

3. テストを書かずに「動いたからコミット」

AI は即座に動くコードを出せるので、テストを書くインセンティブが下がりやすい。 「テストを書かずに進めた機能は、AI でも人間でも後で手戻りする」 という経験則を持つ。

4. Canon TDD の「テスト一覧」を省略

AI が 1 発目から「正解」を出すように見えても、網羅性が保証されない。 テスト一覧 → 1 項目ずつ実装 の規律を守る。

📚 まとめ

  • TDD の本質は「テストから書くこと」ではなく、 「仕様を深く理解すること」
  • テストが書ける = 疎結合の証拠 / テストが書けない = 密結合の証拠 。書きにくさは設計の悲鳴
  • テストが書けない設計は AI 生成コードを検証できない設計 。AI 駆動開発に耐えない
  • Kent Beck の Canon TDD (2024) は テスト一覧 → 1 項目ずつ実装 の規律を明示
  • AI 駆動開発では 「テスト一覧」こそ AI への最初の指示 として機能する
  • テスト網羅性チェックリスト(boolean / enum / 境界値 / 日付 / 国際化)を人間が保持し、AI に渡す前の漏れを塞ぐ
  • テストも AI に書かせて OK。ただし 「実装より先に書く」「カバレッジを高く保つ」「テスト一覧は人間が握る」 の 3 規律を守る
  • 「テストがなければ AI を信じられない」 — TDD は AI 駆動開発の信頼基盤

🔗 関連記事

📖 関連用語

📎 参考資料