Microsoftは、単体テストを生成する多言語対応のオープンソースエージェント、code-testing-generatorを発表しました。このエージェントは、正しそうなテストを生成するだけではありません。まずプロジェクトのリポジトリから学習し、テストが必要なコード、使用されているテストフレームワーク、ファイルの配置場所、ビルドおよび実行コマンドを特定したうえで、リポジトリの通常のテスト経路でテストが検出されることを検証します。
このエージェントは、dotnet/skillsリポジトリのdotnet-test拡張機能として提供されています。テスト対象のコードを分離し、外部サービスやその他の依存関係のモックを作成します。現在の対象範囲には、統合テスト、エンドツーエンドテスト、ブラウザーテスト、パフォーマンステストは含まれていません。
テストを記述する前にリポジトリを理解する
コード生成をすぐに開始するのではなく、エージェントはテスト対象の部分を探し、言語とテストフレームワークを識別し、既存のテストを確認して、新しいテストを配置する場所とその記述方法を把握します。また、ビルドコマンドとテスト実行コマンドも特定します。
このアプローチにより、新しいテストプロジェクトを単独でビルドして実行すると成功するものの、継続的インテグレーション環境で使用されるソリューションやテストコマンドには含まれないという状況を避けられます。そのためエージェントは、リポジトリがテストを検出する方法を調べ、新しいテストがその対象に含まれることを確認します。
エージェントは、依頼の規模に応じて作業レベルを選択します。
- 直接:対象コードを読み取り、テストを記述し、結果を検証します。
- 1回のパス:検索と計画を1回行い、その後で計画を実行します。
- 反復:大規模な依頼をカバーする、または特定のカバレッジ目標に到達するために、検索、計画、実行のサイクルを繰り返します。
テストが成功するだけでなく有用であることを検証
より大規模なタスクでは、エージェントはテストが必要なコードを一覧化し、より単純な部分から始めて、依存関係の多いコードへと進みます。また、各挙動をテストファイルに対応付け、プロジェクト固有の慣習に従い、作業中にテストを実行します。
生成されたコードがビルドできない場合、エージェントはそれを修正します。アサーションのいずれかが正しくない場合は、ソースに戻ってテストを修正します。テスト生成中に本番コードを変更することはなく、外部アドレスを呼び出したり、ポートを開いたり、正確なタイミングに依存したりする単体テストも避けます。
エージェントは完了前に一連の検査を行います。これには、テストを失敗させるはずの小さな変更による、簡略化されたミューテーションテスト、弱いアサーションや欠落したアサーションの検索、要求された各シナリオにテストが存在することの確認が含まれます。また、ワークスペース全体をビルドしてテストスイート全体を実行し、リポジトリのテストコマンドが新しいテストを見つけられることを確認します。
社内テストの結果
最新の社内ベンチマークテストで、エージェントは152タスク中140タスクを完了し、完了率は92.1%でした。一方、同じモデルを使用した標準のCopilotは120タスク、78.9%でした。Microsoftによると、失敗件数は63%減少しました。
最大の差は、ほとんどの判断をエージェントに委ねる曖昧な依頼で現れました。専門エージェントは89タスク中79タスクに成功したのに対し、標準のCopilotは59タスクでした。失敗件数は30件から10件に減少しました。一方、詳細な依頼では結果は近く、エージェントは63タスク中61タスクに成功しました。
特定のコード変更に対するテストの記述を求めた15タスクでは、エージェントがすべてのタスクに成功しましたが、標準のCopilotは1件も成功しませんでした。共通の結果では、両システムが119タスクに成功し、専門エージェントのみが21タスクに成功し、標準のCopilotのみが1タスクに成功し、両システムが11タスクで失敗しました。
エージェントは6,963件のテストを生成し、標準のCopilotは7,129件を生成しました。最終的な行カバレッジの平均は72.4%対72.2%、分岐カバレッジの平均は49.8%対49.1%でした。また、タスクの平均所要時間は、専門エージェントが359秒、標準のCopilotが380秒でした。Microsoftは、成果はより多くのテストを生成したことではなく、信頼性によるものだと述べています。
多言語対応と拡張機能の提供
付属のガイドラインには、.NET、Python、TypeScript、JavaScript、Java、Go、Ruby、Rust、Swift、Kotlin、PowerShell、C++のサポートが含まれています。テストでは、エージェントがすべてのプロジェクトにC#のパターンを適用するのではなく、各リポジトリの慣習を学習することが示されました。
SWE Atlasベンチマークの44タスクによる別のテストでは、エージェントは16タスクを完了し、完了率は36.4%でした。一方、標準のCopilotは12タスク、27.3%でした。生成されたテストは550件のケースに合格し、注入されたバグ360件を検出できました。標準システムでは、それぞれ493件と316件でした。Microsoftは、このベンチマークの方が難しく、完了率が大幅に低いことを認めています。
この拡張機能はGitHub Copilot CLIで使用できるほか、拡張機能サポートを通じてVisual Studio CodeとVS Code Insidersでも利用できます。ただし、このサポートはまだプレビュー段階です。MicrosoftはVisual Studioのサポートにも取り組んでいます。GitHub Copilot CLIに拡張機能をインストールするには、ユーザーは/plugin marketplace add dotnet/skillsコマンドで拡張機能マーケットプレイスを追加し、続いて/plugin install dotnet-test@dotnet-agent-skillsでインストールします。その後CLIを再起動し、code-testing-generatorエージェントを選択します。