CoverUp は、大規模言語モデルを用いて Python コードの高カバレッジな回帰テストを生成するツールである。既存のテストスイートのカバレッジを計測し、実行されない行や分岐を含む関数・メソッド・クラスを特定したうえで、まさにその未カバーのコードを対象とした pytest テストを LLM に求める。合格してカバレッジを増やしたテストは保持され、それ以外については CoverUp が LLM とのチャットを継続し、エラーやなお不足しているカバレッジを指摘して改善を求める。
このツールはマサチューセッツ大学アマースト校の研究者によって CoverUp:Python のための効果的な高カバレッジのテスト生成 で発表され、GitHub で公開されるとともに Zenodo にアーカイブされている。著者らは、CoverUp は任意の Python パッケージに適用でき、そのアプローチは LLM に依存しないと述べているが、開発と評価には OpenAI の GPT-4、GPT-4 Turbo、GPT-4o モデルが用いられた。
機能
CoverUp は SlipCover カバレッジアナライザと Python の抽象構文木を用いて、カバレッジが不足しているコードをセグメントに分割する。セグメントはデフォルトで最大 50 行であり、コンテキストとして外側のクラス定義の数行と元のコメントが保持される。各初期プロンプトは、LLM にエキスパートの Python テスト駆動開発者というペルソナを割り当て、ファイル名を示し、どの行と分岐が実行されないかを述べ、それらの行に行番号のタグを付け、静的解析によって生成された import 文を加えたうえで、アサーションを含み状態の汚染を起こさない完全なテストスクリプトを求める。get_info ツール関数により、LLM は抜粋内の任意の名前の定義を要求でき、本体を省略した部分を Python の ... で示した簡略版のクラス定義またはモジュール定義が返される。
生成されたテストは pytest-repeat で複数回実行され、フレーキーテストが洗い出される。共有状態を汚染するテストに対処するため、このツールはデフォルトで Unix の fork() システムコールを用いて各テストを分離して実行する。代替手段として、汚染を起こすテストを探索して無効化したり、失敗するテストを無効化したりすることもでき、無効化されたテストはレビューのために残される。生成されたテストが必要とする Python モジュールをインストールし、それらを requirements.txt 形式で記録することもできる。プロンプト送信と検証は非同期に実行され、OpenAI の制限内に収まるようリーキーバケット方式のレートリミッタによってリクエストが分散される。また進捗はチェックポイントとして保存されるため、実行を再開できる。プロセス全体を繰り返すことで、以前のパスで取りこぼされたセグメントに LLM の焦点を当て直すことができる。
採用とエコシステム
発表論文では、オープンソースの Python プロジェクトおよび HumanEval から派生したベンチマークスイート上で CoverUp を CodaMosa および MuTAP と比較評価し、その両方より高いカバレッジを報告している。著者らは CoverUp を、Meta の TestGen-LLM など他の LLM ベースのテスト生成ツールと同時期に開発されたものと位置づけている。TestGen-LLM も失敗するテストやカバレッジを追加しないテストを除外するが、会話を継続するのではなくそれらを破棄する。