【みゅーてーしょんてすと】
ミューテーションテスト とは?
最終更新:
💡 コードを少し変えて、テストが気付くかを試す
ソースコードに小さな変更を加えた変異体(ミュータント)を作り、既存テストが変化を検出するか調べる手法。検証の不足を探す手掛かりになるが、テストの品質すべてを一つの値で保証するものではない。
📌 このページのポイント
ミューテーションテストって、わざとバグを入れるの?
例えば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は「変異」の意味。変更したコードで、テストの検出力を試すイメージだよ