生成AIに「これと同じようなバグを見つけるテストコードを書いて」と頼む技法の例と評価結果
与えられたバグレポートから、そのバグと似たようなバグを検出できそうなテストコードを生成する研究があるので紹介します。
Kang, Sungmin, Juyeon Yoon, Shin Yoo, Large language models are few-shot testers: Exploring llm-based general bug reproduction, IEEE/ACM 45th International Conference on Software Engineering 2023.
論文の原典は次で読めますので、ご覧ください。出版社のページはこちら(読むには定期購読しているか購入する必要があります)、著者らのWebはこちらです。
この論文ではLIBROという仕組みを提案しています。LIBROは下の手順で、バグレポートからテストケースを自動生成します。
1. プロンプトエンジニアリング:バグレポートから、生成AIへのプロンプトを構築します。プロンプトには、バグレポートの記述や、テストケース生成を指示する命令を含めます。例として、"MathUtils"の"equals"メソッドがNaN引数に対して誤った結果を返すバグレポートに対し、LIBROは「この問題を再現する自己完結型の例を提供してください」という命令を含むプロンプトを作成する例を論文では紹介しています。
2. 生成AIクエリ:構築されたプロンプトを使用して、生成AIにクエリを実行し、テストコードの候補を生成します。この際、生成AIの出力の多様性を高めるためにtemparatureパラメータを調整します。
3. テストのポストプロセッシング:生成AIから生成されたテストコードを、対象プログラムで実行可能な形式に変換します。テストコードを適切なテストクラスに挿入します。不足している依存関係があれば解決します。具体的には、生成されたテストメソッドと類似したメソッドやクラスを使用している既存のテストクラスを検索し、そこにテストメソッドを挿入します。また、テストに必要なimport文を自動的に追加します。
4. テストの選択とランキング:生成されたテストコードの中から、バグを再現する可能性が高いものを選択し、ランク付けします。ランク付けの基準は、バグレポートとの関連性、生成AIの出力結果との一貫性、テストコードの簡潔さなどです。具体的には、失敗メッセージやテストコードがバグレポートに記述された内容と一致するか、同じエラー出力を示すテストの数が多いか、テストコードが短いかといった基準です。また、同様の失敗を示す複数のテストが存在する場合に、生成AIがバグの再現に成功したと判断するための半田基準を使用します。
具体例
AssertJ-CoreプロジェクトのIssue #2666のバグレポート(assertContainsIgnoringCaseメソッドがtr_TRロケールで'I'と'i'の比較に失敗する)に対し、LIBROは以下のテストコードを生成しました。
public void testIssue952() {
LocaleLocale locale = new Locale("tr", "TR");
Locale.setDefault(locale);
assertThat("I").as("Checking in tr_TR locale").containsIgnoringCase("i");
}
このテストは、バグレポートにコード例が含まれていないにもかかわらず、LIBROがバグレポートの内容を理解し、バグを再現するテストコードを自動的に生成した例です。
評価
Defects4JベンチマークとGHRBデータセットを用いて3つの観点で評価しています。
観点1(有効性) LIBROがどれだけ多くのバグを再現できるか?
Defects4Jというバグのデータベースを使って、LIBROが自動的にテストケースを生成し、バグを再現できるかを試しました。また、EvoCrashという別のツールや、バグレポートからコードをコピー&ペーストするだけの方法と比較しました。結果として、LIBROは、Defects4Jのバグの33.5%を再現できました。また、EvoCrashよりも多くのバグを再現し、特にクラッシュ以外のバグで優れた結果を示しました。
観点2(効率) LIBROがどれだけ効率的にテストケースを生成できるか?
テストケースの生成に必要な時間や、開発者がテスト結果を確認するために必要な手間(工数)を測定しました。その結果、テスト生成の試行回数を増やすほど、再現できるバグの数も増えました。平均で444秒で50個のテストを生成できました。
観点3(実用性) LIBROが実際のソフトウェア開発の現場でどれだけ役立つか?
GHRBという、Defect4Jより新しいバグレポートのデータセットを使って、LIBROの性能を評価しました。また、LIBROがバグを再現できたかどうかを予測する技術が、新しいデータセットでも有効かどうかを検証しました。LIBROは、GHRBデータセットでも約32.2%のバグを再現できました。これは、LIBROが特定のデータセットに特化したものではなく、現実の開発現場でも使える可能性を示しています。