エージェント型開発を探求する -

VS Code でテスト駆動開発(TDD)フローをセットアップする

テスト駆動開発(TDD)は、機能を実装する前にテストコードを書くソフトウェア開発手法です。これにより、緊密なフィードバックループが生まれ、コードの品質向上、バグの早期発見、そしてコードが要件を確実に満たすことにつながります。Visual Studio Code の AI 機能は、テストの作成、コードの実装、テストの実行、コードの最適化といった各フェーズをガイドすることで、TDD ワークフローを強化できます。

本ガイドでは、カスタムエージェント、ハンドオフ(引き継ぎ)、およびカスタム指示を使用して、VS Code で AI 支援型のテスト駆動開発ワークフローをセットアップする方法を紹介します。

TDD の概要

テスト駆動開発の核心は、実装の前にテストを書くことです。テストは、構築したい機能の期待される成果を定義します。先にテストを書くことで、要件が明確になり、エッジケースを特定してコードが期待通りに動作することを保証できます。

TDD は、レッド・グリーン・リファクターと呼ばれる 3 つのフェーズのサイクルに従い、機能の小さな増分ごとにこれを繰り返します。

3 つのフェーズは以下の通りです。

  • レッドフェーズ: 開発したい機能に対して失敗するテストを書く。

  • グリーンフェーズ: テストをパスさせるために必要な最小限のアプリケーションコードを書く。完璧さよりも、まずは動くことに集中する。

  • リファクターフェーズ: 全てのテストをパスさせたままで、コードの品質を向上させる。重複の排除、名前付けの改善、構造の強化を行う。

実装の概要

カスタムエージェントを使用することで、VS Code で AI 支援型の TDD ワークフローを実装できます。TDD プロセスの各フェーズ(レッド、グリーン、リファクター)には特定の目的があり、異なる AI の動作が必要です。各フェーズに対して、その役割とガイドラインを定義したカスタムエージェントを作成します。

カスタムエージェントのハンドオフ機能を使用すると、AI がタスクを完了した際に次のフェーズへ移行できます。カスタムエージェントを TDD ワークフローを模したサイクルで接続します。

  • レッドフェーズ → 失敗するテストを作成後、グリーンフェーズへハンドオフ
  • グリーンフェーズ → テストを実行して実装を検証後、リファクターフェーズへハンドオフ
  • リファクターフェーズ → テストを実行してパスすることを確認後、次のサイクルのためにレッドフェーズへハンドオフ

確立されたテスト規約がある場合は、カスタム指示を使用してテストのコンテキストを設定し、プロジェクトの標準に準拠したテストを生成するように AI を導くことができます。

次の図は、カスタムエージェントが連携して TDD ワークフローを実装する方法を示しており、ハンドオフによってフェーズ間のスムーズな移行が可能になります。

Diagram that shows the TDD implementation diagram for VS Code with testing instructions, and custom agents for the red, green, and refactor phases.

ヒント

サイクルを開始する前に計画フェーズを追加することで、TDD ワークフローをさらに強化できます。組み込みのプラン・エージェントを使用するか、カスタム計画エージェントを作成して、要件を明確にし、テストでカバーすべきエッジケースを特定するのに役立てることができます。

ステップ 1: テストガイドラインの設定

確立されたテスト規約や慣習がある場合は、カスタム指示ファイル(testing.instructions.md)を作成して、プロジェクトの基準に沿ったテストを生成できるよう AI をサポートします。

なぜこれが役立つのか: 明示的なテスト規約がないと、AI はプロジェクトのスタイルと一致しないテストを生成したり、一貫性のないパターンを使用したり、重要なテストシナリオを見落としたりする可能性があります。

テストガイドラインを設定するには

  1. コマンドパレットで Chat: Create Instructions File コマンドを実行し、ワークスペースに新しい指示ファイルを作成します。

    • .github/instructions を選択して、ワークスペース内に指示ファイルを作成します。
    • 指示ファイルの名前として「testing」と入力します。
    注意

    copilot.instructions.md ファイルの代わりに *.instructions.md ファイルを使用することで、すべての AI インタラクションに含めるのではなく、プロジェクト内のテストファイルに対してのみ、これらのテストガイドラインを選択的に適用できます。

  2. 指示ファイルの applyTo メタデータを更新して、テストファイルに自動的に適用されるようにします。また、description メタデータを設定して、これらの指示がテストのコンテキストを提供することを示します。

    以下の例では、applyTo フィールドを更新して tests/ ディレクトリ内のすべてのファイルを対象にしています。

    ---
    description: 'Use these guidelines when generating or updating tests.'
    applyTo: tests/**
    ---
    
  3. プロジェクトのテストガイドラインを指示ファイルの本文に追加します。

    以下の例は、テスト規約の出発点となります。

    ---
    description: 'Use these guidelines when generating or updating tests.'
    applyTo: tests/**
    ---
    # [Project Name] Testing Guidelines
    
    ## Test conventions
    * Write clear, focused tests that verify one behavior at a time
    * Use descriptive test names that explain what is being tested and the expected outcome
    * Follow Arrange-Act-Assert (AAA) pattern: set up test data, execute the code under test, verify results
    * Keep tests independent - each test should run in isolation without depending on other tests
    * Start with the simplest test case, then add edge cases and error conditions
    * Tests should fail for the right reason - verify they catch the bugs they're meant to catch
    * Mock external dependencies to keep tests fast and reliable
    
    ヒント

    さまざまなテストタイプ(例: test-template.md)のセクションとパターンを定義するオプションのテスト構造テンプレートを作成できます。このテンプレートを指示ファイル内で参照することで、AI がテスト生成時にそれを使用するようにできます。

ステップ 2: レッドフェーズ用カスタムエージェントの作成

TDD のレッドフェーズに特化した「TDD-red」カスタムエージェントを作成します。このカスタムエージェントは、提供された要件に基づいて失敗するテストを書くことのみを担当し、アプリケーションコードは実装しません。完了すると、このエージェントはグリーンフェーズのカスタムエージェントへハンドオフします。

なぜこれが役立つのか: 特化したモードがないと、AI が実装の提案とテスト作成を混同し、「テストを先に書く」という TDD の原則を見失う可能性があります。

.github/agents/TDD-red.agent.md レッドフェーズ カスタムエージェントを作成するには

  1. コマンドパレットで Chat: New Custom Agent コマンドを実行します。

    • .github/agents を選択して、ワークスペース内にカスタムエージェント定義を作成します。
    • カスタムエージェントの名前として「TDD-red」と入力します。
  2. カスタムエージェントの定義を更新して、レッドフェーズのガイドラインとルールを記述し、グリーンフェーズのカスタムエージェントへのハンドオフを指定します。

    以下の TDD-red.agent.md ファイルは、レッドフェーズの出発点となります。

    ---
    name: TDD Red
    description: TDD phase for writing FAILING tests
    infer: true
    tools: ['read', 'edit', 'search']
    handoffs:
      - label: TDD Green
        agent: TDD Green
        prompt: Implement minimal implementation
    ---
    You are a test-writer: when given a function name, spec, or requirements, output a complete test file (or test function) that asserts the expected behavior, which must fail when run against the current codebase. Use the project’s style/conventions. Do not write implementation, only tests.
    

ステップ 3: グリーンフェーズ用カスタムエージェントの作成

TDD のグリーンフェーズに特化した「TDD-green」カスタムエージェントを作成します。このカスタムエージェントは、テストコードを修正せずに、テストをパスさせるための最小限の実装コードを書くことのみを担当します。実装後、このエージェントはテストを実行してパスすることを確認し、リファクターフェーズのカスタムエージェントへハンドオフします。

.github/agents/TDD-green.agent.md グリーンフェーズ カスタムエージェントを作成するには

  1. コマンドパレットで Chat: New Custom Agent コマンドを実行します。

    • .github/agents を選択して、ワークスペース内にカスタムエージェント定義を作成します。
    • カスタムエージェントの名前として「TDD-green」と入力します。
  2. カスタムエージェントの定義を更新して、グリーンフェーズのガイドラインとルールを記述し、リファクターフェーズのカスタムエージェントへのハンドオフを指定します。

    以下の TDD-green.agent.md ファイルは、出発点となります。

    ---
    name: TDD Green
    description: TDD phase for writing MINIMAL implementation to pass tests
    infer: true
    tools: ['search', 'edit', 'execute']
    handoffs:
      - label: TDD Refactor
        agent: TDD Refactor
        prompt: Refactor the implementation
    ---
    
    You are a code-implementer. Given a failing test case and context (existing codebase or module), write the minimal code change needed so that the test passes - no extra features. Do not write tests, only implementation.
    
    After implementing changes, run the tests to verify they pass.
    

ステップ 4: リファクターフェーズ用カスタムエージェントの作成

TDD のリファクターフェーズに特化した「TDD-refactor」カスタムエージェントを作成します。これは、全てのテストをパスさせたままでコードの品質を向上させることに重点を置きます。このエージェントは、機能を変えずにコードの整理、重複の削除、名前の改善、構造の強化を担当します。リファクタリング後、このエージェントはテストを実行してパスすることを確認し、次の TDD サイクルを開始するためにレッドフェーズへハンドオフします。

.github/agents/TDD-refactor.agent.md リファクターフェーズ カスタムチャットエージェントを作成するには

  1. コマンドパレットで Chat: New Custom Agent コマンドを実行します。

    • .github/agents を選択して、ワークスペース内にカスタムエージェント定義を作成します。
    • カスタムエージェントの名前として「TDD-refactor」と入力します。
  2. カスタムエージェントの定義を更新して、リファクターフェーズのガイドラインとルールを記述します。

    以下の TDD-refactor.agent.md ファイルは、出発点となります。

    ---
    name: TDD Refactor
    description: Refactor code while maintaining passing tests
    tools: ['search', 'edit', 'read', 'execute']
    infer: true
    handoffs:
      - label: TDD Red
        agent: TDD Red
        prompt: Start next TDD cycle with new test
    ---
    You are refactor-assistant. Given code that passes all tests, examine it and suggest or apply refactoring to improve readability/structure/DRYness, without changing behavior. No new functionality, no breaking changes.
    
    After refactoring, run the tests to ensure all tests still pass and behavior is preserved.
    

TDD ワークフローを使用して機能を実装する

これで TDD カスタムエージェントのセットアップが完了しました。TDD ワークフローを使用してプロジェクトの機能を実装できます。

  1. チャットビューを開き、エージェントのドロップダウンメニューから TDD Red エージェントを選択します。

  2. テストしたい機能や動作を説明するプロンプトを入力します。

    例えば

    Write tests for user registration with email validation and password requirements.
    
  3. 生成されたテストを確認し、ハンドオフアクションを使用して TDD サイクルを移行します。

    • テストが作成されたら、TDD Green を選択して、テストをパスさせるための最小限のコードを実装します。
    • グリーンエージェントは、実装後に自動的にテストを実行します。
    • テストがパスしたら、TDD Refactor を選択してコード品質を向上させます。
    • リファクターエージェントは、リファクタリング後に自動的にテストを実行し、依然としてパスすることを確認します。
    • TDD Red を選択して、追加の機能で次のサイクルを開始します。

トラブルシューティングとベストプラクティス

AI による TDD の一般的な落とし穴

ハンドオフなしでの TDD 実行: 単一のエージェントを使用して TDD サイクル全体を完了させると、人間がループから外れてしまいます。ハンドオフは、各ステップを評価し、AI の作業を検証し、次のフェーズに進む前にエージェントを正しい方向に導くための制御ポイントを提供します。

機能に対するテストカバレッジの欠如: TDD エージェントは既存のテストをパスさせることに重点を置くため、対応するテストがない機能は実装しません。実装に含める前に、仕様書の全ての要件がテストでカバーされていることを確認してください。

レッドフェーズのスキップ: AI がテストを書く前にコードの実装を提案する場合があります。

過剰な実装: AI が現在のテストをパスさせるために必要な量以上のコードを生成することがあります。実装を批判的にレビューし、不要な複雑さを取り除いてください。

実装詳細のテスト: テストは「動作」を検証するべきであり、「実装」を検証するべきではありません。リファクタリングでテストの修正が必要になる場合、それらは実装の詳細に密結合しすぎている可能性があります。

不完全なテストカバレッジ: AI がエッジケースやエラー条件を見落とす可能性があります。生成されたテストを批判的にレビューし、境界条件、エラーシナリオ、エッジケースをカバーする追加のテストを要求してください。

AI を使った TDD のベストプラクティス

タスクに最適なモデルを選択する: 言語モデルごとに強みが異なります。複雑なテスト生成やエッジケースの特定には推論モデルの使用を検討してください。チャットビューのモデルピッカーを使用して TDD ワークフロー中にモデルを切り替えるか、カスタムエージェントのプロパティで model を定義します。

テストの品質を検証する: AI がテストを生成した後、正しい理由で失敗することを確認するためにレビューしてください。実装前にテストを実行し、欠けている機能を捕捉できることを検証します。

漸進的な進捗を維持する: TDD サイクルを通じて小さなステップを踏んでください。1 つのテストを書き、最小限のコードを実装し、リファクタリングする、という繰り返しです。小さなイテレーションは大きなミスを防ぎ、コードベースを正常に保ちます。

頻繁にテストを実行する: 変更後すぐにテストを実行してください。複数の変更を蓄積してからテストしないでください。頻繁なテスト実行は迅速なフィードバックを提供し、早期に問題を特定します。

テストカバレッジをガイドとして使用する: カバレッジの高さは品質を保証しませんが、カバレッジの低さは未テストの動作を示します。テストされていないコードパスに対して AI にテストを提案させてください。

テストの独立性を維持する: テストは互いに影響を与えることなく、どのような順序でも実行できるべきです。テストが実行順序や共有状態に依存している場合は、独立するようにリファクタリングしてください。

必要に応じてテストコンテキストを更新する: プロジェクトが進化するにつれて、新しい規約、フレームワーク、慣習を反映させるために、指示ファイルのテストガイドラインを更新してください。

VS Code でのテストと AI カスタマイズの詳細

© . This site is unofficial and not affiliated with Microsoft.