世界を動かす技術を、日本語で。

テスト駆動開発のための私のエージェントスキル

2026年6月4日原文(saturnci.com)

概要

  • 現在のAIエージェントはテスト作成が苦手
  • 多くの人間によるテスト例も低品質
  • Kent BeckのCanon TDDが有効な指針
  • 独自のSpecify-Encode-Fulfillループを提案
  • テスト設計・ソフトウェア設計レビューで品質向上

AIエージェントとテスト作成の現状

  • 2026年5月時点 では、AIエージェントによるテスト作成の品質が低水準
  • 曖昧・難解・過剰・ハック的・非効率・自己満足的・無意味なテストが多発
  • 人間のテスト例自体が悪い影響、教師の指導も不十分
  • 教育・実務現場ともにテスト文化の課題

TDD指針としてのKent Beck's Canon TDD

  • Kent Beck's Canon TDD の単純な指示だけでAIのテスト作成能力が大幅向上
  • Canon TDDの流れ
    • 現在のTDDセッションの範囲内で仕様リスト作成
    • 各仕様を自動テストとして実装
    • テスト失敗を解消するために必要最小限のコード変更
      • 推測的コーディングの回避
    • 振る舞い変更のコミット後のみリファクタリング
      • 振る舞い変更とリファクタリングの混在禁止
    • 仕様リストが空になるまで繰り返し

Specify-Encode-Fulfill(SEF)ループ

  • Specify :作りたいものの仕様策定
  • Encode :仕様を自動テスト(実行可能な仕様)として記述
  • Fulfill :仕様を満たすコード実装
  • SEFはTDDの本質を高い視点で捉えるための代替フレームワーク

テスト設計・ソフトウェア設計のレビュー

  • テスト設計自体の質向上には Test Design Review スキルを別途導入
    • 別エージェントによるバイアス回避
    • 設計原則違反の検出・修正提案
  • 一般的なソフトウェア設計原則の違反も Software Design Review で確認
    • 「ものごとをそのまま呼ぶ」など基本原則の徹底
  • テストが書きにくい場合は「キッチンを片付けてから料理する」発想でリファクタリングを検討

結論とAI活用の本質

  • 100%満足できるテストは未達成だが、TDDスキル導入で大幅改善
  • 時代を超える普遍的な原則AI の組み合わせが最大の生産性向上要因
  • 新技術が登場しても、基本原則は不変で有用

Hackerたちの意見

この記事には日付があった方がいいね。最近の情報っぽいけど(インターネットアーカイブでは5月29日にキャッチされたみたい)、モデルやエージェントが進化するから、すぐに古くなっちゃう情報なんだよね。(最近は、Claude CodeとCodexに「uv run pytestでテストして、赤/緑TDDを使え」って言うだけで、いい結果が出てる。)

私もそう思うけど、モックに偏りすぎてるのが嫌だな(これはトレーニングデータに過剰に表れてるのは認めるけど)。

プロンプトエンジニアリングはすぐに古くなっちゃうね。今どき「あなたはエキスパートのソフトウェアエンジニアです。間違いを犯さないでください」なんて言わないよね(笑)。個人的な体験として、大きなプロンプトやスキルはコンテキストウィンドウの予算を消費しちゃうことが多いし、エージェントは現在のタスクにあまり関係ないスキルでも使おうとすることが多い。だから、スキルが多すぎると、どれが必要かをチェックボックスで確認するのに時間がかかっちゃうんだよね。

これが今週のAGENTS.mdの一部だよ(FDEをプレイ中で、クライアントのためにカスタムワークフローを実装して、20倍の生産性を実現した)。# Pythonツール - uvを使ってPython環境と依存関係を管理する。 - uv runでPythonスクリプトやコマンドを実行する。 - コードのテストにはpytestを使う。 - 複雑な入力空間やエッジケースをテストする必要があるときは、hypothesisライブラリを使ってプロパティベースのテストを行う。 - pyproject.tomlを直接編集しない。代わりに、依存関係を管理するためにuv adduv add --devを使う。 - コードの品質とリンティングにはruff、ty、prek、wilyを使う。 - 過度なキャスティングは避ける。頻繁に型をキャストする必要があるなら、もっと適切な型を使うようにコードをリファクタリングすることを考えてみて。キャスティングは外部システムとインターフェースする境界層でのみ行うべき。 - コードに変更を加えた後は、適切なツールを実行して品質基準を満たしているか確認する。 - バグやリグレッションに遭遇したら、テストを書くことや、将来的に同じことが起こらないようなコードを作ることについて真剣に考える。 - コマンドラインインターフェースを作成するときは、デバッグに役立つログ出力を提供する--verboseフラグを追加する。 - コードを作成する前に、問題を解決するための5つの異なるアプローチを考えて、それらを効果的な順に並べる。その後、最適なアプローチを選んで実装する。 - 書くコードにはすべてテスト駆動開発(TDD)を使う。実装コードを書く前にテストを書く。 - 重複を避けるために、conftest.pyファイルにpytestフィクスチャを集める。 - 可能な限り実際のコードをテストすることを優先する。絶対に必要なときだけダブルやmonkeypatchを使う。モックはできるだけ避ける。 - pytestのmonkeypatchを好む。 - テストが失敗したら、まずuv run pytest --last-failedを使って最後に失敗したテストを実行する。 - 作成するすべての関数やクラスにはnumpyスタイルのドックストリングを使う。 - 関数のドックストリングには例を提供するためにドクトテストを含める。 - すべての関数パラメータと戻り値の型ヒントを使う。 - 失敗の洞察を提供するためにロギングを使う。デバッグにはprintを使わない。スタックトレースを隠すためにロギングを使わない。

参考までに、レスポンスヘッダーには以下が含まれています: Last-Modified: Fri, 22 May 2026 19:08:09 GMT

すべての記事には日付を入れるべきだよね!

いい指摘だね!日付を追加するよ。

https://github.com/jasonswett/llm-skills/blob/main/tdd/SKILL... にはタイムスタンプがあるね(2026年3月14日現在)

ここでスキルを使うのは間違ったアプローチだと思う。LLMはすでにTDDが何か、どうやってやるかを知ってるから、オブジェクト指向プログラミングと同じようにね。もしこれがスキルにエンコードされてるとしたら、そのスキルはLLMがやるすべてのことにロードされなきゃいけない。これはAGENTS.mdを通じて直接指示を出すのが一番いい数少ない領域の一つだと思うし、ここで問題を強制するためにあまり指示は必要ないと思う。でも、OPは自分のエージェントをすごく特定のやり方で動かそうとしてるだけだと思う。それも悪くないよね。 > 5. テストを見せて、続ける前に承認を求めてください。

スキルはただのマークダウンファイルだってことをみんな忘れがちで、TDDが意味を持つとは思わない。これはカスタムコードベースやあまり使われない道を進むときに特定のニッチ向けのものだと思うし、今後の教訓を保存するためのものだよね。でも、みんな自分のやり方を選ぶ自由があるし、私たちが知らない方法で必要になることもあるかもしれない。

私の経験では、確かにLLMはTDDやOOPについて知ってるけど、教えない限りその知識に基づいて行動するわけじゃないんだよね。もちろん、互いに矛盾することをたくさん「知っている」わけだし。

エージェント開発においてTDDは理論上は素晴らしいけど、トークンコストが膨れ上がるのにすぐ気づくよね。よく機能を作った後に、それが再利用されたり削除されたり、コードがリファクタリングされたりするから。TDDだと、かなり負担がかかって、進行速度が遅くなっちゃう。特にマルチエージェントのセットアップがあると、TDDを試した後はウォーターフォールアプローチの方がいいと思う。あと、いくつかのケースでは、テストが実際に書かれたコンポーネントをテストしていない表面的な幻覚だったり、コンテキストが壊れて誤ったポジティブを引き起こして、意図しないリファクタリングを引き起こすこともあった。

Hacker Newsで議論の続きを見る