章: 第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回: リファクタリングの防波堤を作る で、安全なリファクタリングのためのテスト防衛線工法を学びます。