第17回: Mutation Testing入門 — 「カバレッジ100%」だからといって、テストは十分ですか?

章: 第7章: テスト拡張と品質自動化

カバレッジ指標は「コードが実行されたか」を測るだけで、「アサーションが正しいか」は別問題です。「if ($a > 0)if ($a >= 0) に変更してもテストが逃げる」という状態は、Mutation Testingで初めて露呈できます。

Infectionを使った Mutation Testingは、コードに微小な変更(「歯子」)を導入し、テストが失敗するかの検証でテストの検出力を測ります。

なぜMutation Testingが重要なのか

通常のカバレッジツールには次の限界があります。

  • assertNotNull($result) だけで実際の内容を検証せずカバレッジは満たせる
  • 条件式の解釈が誤っていてもテストが通る
  • 「牧場麻痺」状態のテストが増える

チェックポイント: MSI(Mutation Score Indicator)が50%未満のコアロジックは、カバレッジが高くても死角と言える。刺激でテストを読み直してみましょう。

カバレッジ vs MSI

指標 測るもの 潜在リスク
ラインカバレッジ 実行行数 検証の深さは見ない
MSI 歯子を殺せた割合 テストの強さを測る

実装例


# Infectionインストール
composer require --dev infection/infection

# 実行
vendor/bin/infection --threads=4

# 結果例
# Killed: 85 / Escaped: 15
# MSI: 85%

まとめ & 次のステップ

  • Mutation Testingは「アサーションの強さ」を数値化する唯一の手法
  • MSIが低いエリアは「実質的にカバーされていない」パスの警告
  • 全コードに適用するのではなく、コアロジックのドメイン層から優先して対象とする
  • CIに組み込む場合は負荷時間を気にするため、小さいターゲットから導入する

次回は 第18回: リファクタリングの防波堤を作る で、安全なリファクタリングのためのテスト防衛線工法を学びます。

Related Articles