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

テスト駆動開発(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: テストガイドラインをセットアップする

テスト規約とプラクティスを確立している場合は、AIがプロジェクトの標準に沿ったテストを生成するのに役立つカスタム指示ファイル(testing.instructions.md)を作成します。

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

テストガイドラインをセットアップするには

  1. コマンドパレットでチャット: 命令ファイルを作成コマンドを実行し、ワークスペースに新しい命令ファイルを作成します。

    • .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. コマンドパレットでチャット: 新しいカスタムエージェントコマンドを実行します。

    • .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. コマンドパレットでチャット: 新しいカスタムエージェントコマンドを実行します。

    • .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. コマンドパレットでチャット: 新しいカスタムエージェントコマンドを実行します。

    • .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.