TL;DR

DiffTestGenは、プルリクエストで変更されたコードの振る舞いの差異を自動的に検出するLLMベースのテスト生成手法です。静的コールグラフ解析と公開APIドキュメントを活用して変更コードに到達可能なエントリポイントを特定し、新旧両バージョンの変更行をカバーするユニオンカバレッジを反復的に改善します。463件のPRで評価した結果、78.2%のPRで振る舞いの差異を検出し、平均ユニオンカバレッジ90.7%を達成しました。

解説

AMI HAPPY

ねえ智也くん、このDiffTestGenって論文、面白そうだね!プルリクエストの変更を自動でテストしてくれるんでしょ?

TOMOYA NEUTRAL

そうだね。コードの変更で振る舞いが変わったところを、LLMを使って自動でテストケースを生成する手法だよ。

AMI SURPRISED

へー、でもなんでそんなのが必要なの?普通のテストじゃダメなの?

TOMOYA NEUTRAL

既存のテストは変更前のコードに合わせて書かれてることが多いから、変更後の新しい振る舞いをカバーできてないことがあるんだ。DiffTestGenはそのギャップを埋めるために作られたんだよ。

AMI HAPPY

なるほど!で、どうやってテストを生成してるの?

TOMOYA NEUTRAL

まず静的コールグラフ解析で、変更されたコードに到達できるエントリポイントを特定するんだ。それから公開APIのドキュメントも使って、正しいテストの呼び出し方をLLMに教える感じ。

AMI SURPRISED

あ、それでちゃんと動くテストが作れるんだね。でも、新旧両方のコードをテストするってどういうこと?

TOMOYA NEUTRAL

変更前と変更後の両方でテストを実行して、結果が違う行をカバレッジとして計測するんだ。それを「ユニオンカバレッジ」って呼んでて、反復的に改善していくんだよ。

AMI HAPPY

評価結果はどうだったの?

TOMOYA NEUTRAL

463件のプルリクエストで試した結果、78.2%で振る舞いの差異を検出できて、平均ユニオンカバレッジは90.7%だったんだ。結構高いね。

AMI HAPPY

すごい!じゃあもう完璧じゃん!

TOMOYA NEUTRAL

いや、まだ限界もあるよ。例えば、外部サービスに依存するコードとか、複雑な状態を持つコードだと精度が落ちるみたい。あと、LLMの出力に依存するから、たまに変なテストを生成することもある。

AMI HAPPY

ふーん、でも実用的にはかなり使えそうだね!これで私もプルリクエストのレビューが楽になるかな?

TOMOYA NEUTRAL

亜美さんがコード書けるようになったらの話だけどね。

AMI SAD

あ、痛いとこ突かれた…!でもいつか書けるようになるもん!