ミューテーションテストとは - テストの品質を数値で測定する手法

ミューテーションテストはソースコードに意図的な変異を注入し、テストが検出できるかで網羅性を評価する手法。Stryker/PIT の導入手順とスコアの読み方を解説

テスト品質

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

ミューテーションテスト (Mutation Testing) は、ソースコードに意図的な変異 (ミュータント) を加え、既存のテストがその変異を検出できるかを検証する手法である。テストの品質を測る「テストのテスト」と言える。

コードカバレッジが 100% でも、テストが実際にバグを検出できるとは限らない。ミューテーションテストは、テストの検出力 (バグを見つける能力) を定量的に評価する。

仕組み

元のコードに小さな変異 (ミュータント) を加え、既存のテストスイートがその変異を検出できるかを確認する。テストが失敗すればミュータントは「殺された」(テストが有効)、テストが通過すればミュータントは「生存」(テストが不足) と判定される。

1. 元のコード: if (age >= 18) return "adult";
2. ミュータント生成: if (age > 18) return "adult";  (>= を > に変異)
3. テスト実行: age=18 のテストケースがあれば失敗 → ミュータント「殺された」(検出成功)
              age=18 のテストがなければ通過 → ミュータント「生存」(テスト不足)

ミューテーションスコア

ミューテーションスコアを図で示す。

ミューテーションスコア = 殺されたミュータント数 / 全ミュータント数 × 100%
スコア評価
90% 以上テストの検出力が高い
70〜90%改善の余地あり
70% 未満テストが不十分

代表的な変異演算子

代表的な変異演算子を以下にまとめる。

演算子元のコード変異後
条件境界>=>
否定if (x)if (!x)
算術演算子a + ba - b
戻り値return truereturn false
削除validate(input)(行を削除)

コードカバレッジとの違い

コードカバレッジとの違いを以下にまとめる。

指標コードカバレッジミューテーションスコア
測定対象コードの実行率テストの検出力
弱点実行しただけで検証していないコードも 100%計算コストが高い
add(1, 2) を呼ぶだけで行カバレッジ 100%add の結果を assertEquals で検証しないとミュータント生存

ツール

主なツールを以下にまとめる。

言語ツール
JavaScript/TypeScriptStryker
JavaPIT (pitest)
Pythonmutmut
Rustcargo-mutants

実務での活用

全コードにミューテーションテストを適用すると実行時間が膨大になるため、以下のように対象を絞る。

  • ビジネスロジックの核心部分 (金額計算、権限チェック) に限定する
  • 新規コードの PR レビュー時に CI で実行する
  • コードカバレッジが高いのにバグが出る領域に適用する

関連書籍も参考になる。

この記事は役に立ちましたか?

関連用語

関連する記事