TDDで生成AIに仕様と設計を指示してみました

生成AIでプログラミングするには、コードを導くプロンプトを書きます。テスト駆動開発 (TDD) ではプロダクトコードを導くテストを書きます。それならば、人がテストを書いてAIにプロダクトコードを書いてもらったらどうだろうか。

そう思って実験してみたところ、思ったよりもスムーズに進み、プロダクトコードはほぼすべて生成AIだけで完成しました。プロダクトコードは、私が書いたテストおよび最終的な仕様を満たしています。あくまで所感ですが、以下のような効果がありました。

  • 仕様を満たすプロダクトコードが、短時間で完成した
  • 私が考えた設計意図を、テストを通して実装に繋げられた
  • コードの詳細な理解は、自分で書いたときよりは劣る
  • テストとしての網羅性は不完全。普通のTDDと同程度で、テストが特に多く必要とはならない

テストの網羅性が不完全というのは、網羅的なテストを書かなくても妥当なプロダクトコードができるという意味で、ここではメリットとして取り上げています。

TDDはテストを先に書く (テストファースト) というよりは、テストコードとプロダクトコードを同時に、並行して少しずつ書き足していくアプローチです。小さなテストをひとつ書き、プロダクトコードを少しだけ書き進める。今回の実験でも小さいサイクルで意識して、人間プログラマがテストをひとつ書き、生成AIにプロダクトコードを少し書いてもらうという繰り返しを実践しています。

やってみるなかで、AIを利用したTDDの上手いやり方や注意点もいくつか発見しました。

  • 人が仕様を元にテストを書いてAIにプロダクトコードを生成してもらうと良い
  • 内部設計についてのテストを書いて、設計意図を伝える
  • 生成結果をクリアにイメージできるようにテストを書く。生成結果がイメージと合っているか確認する
  • 生成されたコードが不十分なら、問題を指摘するテストを書く
  • 生成されたコードが理解できなくなったら、後退してからテストと設計を見直す
  • テストが失敗したらチャットでAIに直してもらう。失敗時の実行結果に加えて、問題や対応方針を読み取って伝える
  • テストの整理もAIに頼める。テストの構成がはっきりしていれば、テストの生成も部分的に頼める

今回の実験にあたり、クリエーションライン株式会社からAnthropicのAPIキーを提供していただきました。感謝いたします。なお私 (やっとむ)は、クリエーションライン株式会社をアジャイルコーチとして支援しています (2024年現在)。

お題はLeetCodeのものを改変した、独自のプログラミング課題を用いています。IDEはCursor、AIモデルはclaude-3.5-sonnet、言語はPythonとpytest、人間プログラマは私です。実験の様子はステップバイステップで記録し、どのようにテストとプロダクトコードを書き進めたか把握できるようにしています。また、生成AI対応IDEであるCursorとClaude3.5 Sonnetモデルの使い方の、説明にもなっていると思います。

資料は長くなってしまったので、Google Documentで読めるようにしました。以下から閲覧できます。

TDD&AIで仕様通りのテストとコードを書いていく - Google ドキュメント