【みゅーてーしょんてすと】

ミューテーションテスト とは?

最終更新:
💡 コードを少し変えて、テストが気付くかを試す

ソースコードに小さな変更を加えた変異体(ミュータント)を作り、既存テストが変化を検出するか調べる手法。検証の不足を探す手掛かりになるが、テストの品質すべてを一つの値で保証するものではない。

📌 このページのポイント
小さな変更をテストが見抜ける? 元の条件 x > 0 変更後 x >= 0 変更 同じ変更を、別々のテスト例で比較 x = 0 も確かめる 期待:false 変更後:true 不一致 → 検知できた x = 1 だけ確かめる 期待:true 変更後:true 一致 → 見逃す 生存=必ずテスト不足、とは限らない 振る舞いが変わらない「同値」の変異もある
境界値0を含むテストの有無を比べた例です。スコアは、無効な変異やタイムアウトをどう集計するかによっても変わります。
ひよこ ひよこ
ミューテーションテストって、わざとバグを入れるの?
ペンギン先生 ペンギン先生
例えばxが0より大きいという条件を、0以上に変えるんだ。こうして作った変異体をミュータントと呼び、元のコードを通るテストが変更後に失敗するかを調べるよ。
ひよこ ひよこ
テストが通っちゃったら?
ペンギン先生 ペンギン先生
生き残ったsurvivedという結果になるよ。境界値を試していない、結果を十分に検証していない、といった不足を探す手掛かりになる。ただし、動作が変わらない等価ミュータントなら、テストを追加しても区別できないんだ。
ひよこ ひよこ
コードカバレッジが100%なら十分じゃない?
ペンギン先生 ペンギン先生
コードを通っていても、結果の違いをチェックしているとは限らないよ。例えば条件の境界である0をテストしていなければ、0より大きいか0以上かの違いを見逃す可能性があるんだ。
ひよこ ひよこ
スコアが高ければ安心?
ペンギン先生 ペンギン先生
生成した変異をどれだけ検出したかの指標で、バグがない保証ではないよ。ツールによって集計の扱いがあり、例えばStrykerはkilledとtimeoutを検出数に含め、コンパイルエラーなどはスコアの対象から除くんだ。
ひよこ ひよこ
実行時間はかかるの?
ペンギン先生 ペンギン先生
複数の変異ごとにテストを動かすので負担は増えるよ。毎回必ず全テストを実行するわけではなく、Strykerではその変更箇所を通るテストを選ぶ最適化もある。スコアだけでなく、生き残った変異の内容と実行コストを見て活用しよう。
もっと詳しく知りたい人へ

Strykerのミューテーションスコアはどう計算する?

検出数÷有効なミュータント数×100です。検出数はkilledとtimeout、有効数はそれらにsurvivedとno coverageを加えた数です。compile error、runtime error、ignoredなどはその分母に入りません。全生成数で割る式とは異なるので、利用するツールやレポートの定義を確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ミューテーションテスト」って出てきたら「コードの小さな変更をテストが検出するか調べる手法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Mutation Testing」 = 変異を加えるテスト
💬 Mutationは「変異」の意味。変更したコードで、テストの検出力を試すイメージだよ

参考資料

← 用語集にもどる