テスト生成におけるAI:役立つ場面と欺瞞
AIはテストを素早く書きます。しかし、一見本物のように見えても、間違った内容を検証するテストも書きます。カバレッジは上がっているように見えても、コード自体は壊れたままということが起こり得ます。
AIは特定のタスクにおいて非常に有用です。以下の用途で活用しましょう:
- 優れた例からの推論。完璧なテストを1つ書けば、AIはあなたのスタイルを正確に模倣して、さらに10個のテストを書くことができます。
- 単純な繰り返し作業の処理。セットアップ・ブロック、ティアダウン、ファクトリ・ヘルパーなどの作成に利用します。
- 初期スキャフォールディング(雛形)の作成。白紙の状態から始めるよりも、早くエディタでの作業に移れます。
危険なのは、AIに「契約(contract)」を決めさせてしまうときです。
AIに関数を与えてテストを依頼すると、AIはコードを読み取り、「現在のコードが何をしているか」をテストします。「コードが何をすべきか」をテストするわけではありません。これにより、閉じたループ(循環)が生じます。AIが仮定を立て、コードを書き、そしてその仮定と一致するテストを書く、という流れです。
本番環境でバグが発生するのは、テストスイートがバグと同じ側に立っていたからです。
次の3つの罠に注意してください:
実装に依存したテスト AIはビジネスルールではなく、ロジックのパスをテストしがちです。内部の細かな詳細を変更しただけで、結果が正しくてもテストが失敗してしまいます。これではリファクタリングが困難になります。
浅いエッジケース AIはnull、空文字、ゼロなどのテストは得意です。これらは明白なケースです。しかし、「ドメインのエッジ(境界条件)」を見つけることはできません。特定のタイムゾーンに関するバグや、データベースの癖、独自のビジネスルールなどは知り得ないのです。
脆い(もろい)モック AIは何でもモック化したがります。これは2つの問題を引き起こします:
- モックが間違っている:現実とは一致しない、偽のAPIを模倣してしまいます。
- モックが実装を固定してしまう:最終的な結果をテストするのではなく、コードが他の関数をどのように呼び出しているかをテストすることになってしまいます。
AIを正しく使う方法:
「意図(intent)」をAIの手の届かない場所に置いておくことです。
- まず契約(contract)を書く。すべてのテストに対して、平易な言葉で1文の指示を書きます。例:「期限切れのコードは、元の金額を返さなければならない」。
- その文章をAIに渡す。アサーション(検証)はAIに書かせますが、意味(定義)は人間が提供します。
- 境界でモック化する。外部APIやデータベースのみをモックにします。自社の内部モジュールには実物を使用してください。
- ドメインのエッジケースを1つ手書きする。関数を書き終えるたびに、自分が懸念していることを1つ書き出します。それをAIへのプロンプトとして利用してください。
AIは生産性向上のためのツールであり、思考の代わりではありません。テストの本体を書くためにAIを利用しましょう。しかし、テストの目的をAIに決めさせてはいけません。
Source: https://dev.to/nazar_boyko/ai-for-test-generation-where-it-helps-and-where-it-lies-jhm
Optional learning community: https://t.me/GyaanSetuAi
