DESIGN / CODE / INFRA / AI

解説

AIが書いたテストは間違いを検出できる?わざと違う結果を入れて点検しよう

テストが通っても、必要な条件を確認しているとは限らない。型だけの確認と、独立した期待値の確認を、小さな関数で比べる。

AIが書いたテストは間違いを検出できる?わざと違う結果を入れて点検しよう
保存リストを見る →
この記事の道しるべ 4項目

AIに関数とテストを作ってもらい、全部通った。けれど、そのテストは間違った結果も通してしまわないだろうか。正しいと分かる例と、意図的に違う結果を返す例を分け、テストの検出力を確かめてみよう。

今回はPythonの小さな架空の計算だけを使う。実際のプロジェクトや本番コードを書き換えず、一時的な練習用プログラムで試すよ。

仕様から期待値を先に決める

仕様は「単価と個数を掛け、合計を返す」。単価4、個数3なら、期待する値は12。この値は関数を実行して写すのではなく、仕様から独立して求める。

型が整数であるかだけを見ると、12以外の整数も通ってしまうね。何を満たせば合格かを、実装とは別に書いておくことが大切だよ。

正しい関数と、わざと違う関数を比べる

def correct_total(price, count):
    return price * count

def wrong_total(price, count):
    return price + count

def type_only(calc):
    return isinstance(calc(4, 3), int)

def expected_value(calc):
    return calc(4, 3) == 12

for name, calc in [("correct", correct_total), ("wrong", wrong_total)]:
    print(name, type_only(calc), expected_value(calc))

期待する表示はcorrectがTrue True、wrongがTrue False。足し算に変えた関数も整数7を返すので、型だけでは間違いを検出できない。期待値と比較する条件なら、今回の違いを見つけられるよ。

これは意図的に小さな間違いを入れた練習で、正しいコードを本番で壊す手順ではない。確認後は練習用の関数だけを片付けよう。

間違いが検出できても、テストは完成ではない

4と3の例が通るだけでは、0個、負の値、端数、異なる型などの扱いは分からない。どこまで認める仕様かを決め、その範囲へ確認を広げる必要がある。

例えば0個が有効な仕様なら、単価4、個数0の期待値は0。わざと足し算した実装は4を返すので、この例でも違いを検出できる。何が正しいかを定めずに、境界の数字だけを増やさないようにしよう。

AIへの依頼には、仕様と期待値を渡す

単価×個数の合計関数を点検します。
単価4・個数3の期待値は12、単価4・個数0は0です。
型だけでなく期待値を確認するテストを示してください。
実装を足し算へ変えた練習用の関数に対して、どの確認が失敗するかも説明してください。
本番のコードを書き換える操作は行わないでください。

これは依頼文の例。AIの説明が自然でも、示されたテストを実際に動かし、どの間違いが検出されたかを見ることが必要だよ。

実装から同じ式をコピーして期待値を作ると、同じ誤りを共有する可能性がある。業務の仕様、手計算できる小例、既存の確かめられた結果など、別の根拠を持つようにしよう。

編集部ではPython 3.12で二つの実装と、型・期待値の結果、0個の例を確認した。実際のAIモデルへ生成させた実験や、すべての不具合を検出する保証ではないよ。

条件の選び方は境界テスト、評価例を分ける考え方は調整用と確認用の例も参照してね。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。