TL;DR

テスト対象のコードに意図的な変異(ミュータント)を埋め込み、既存のテストスイートがそれを検出できるかを評価する手法。欠陥挿入とも呼ばれる。

なぜ必要か

テストカバレッジだけでは、テストの実効性は分からない。たとえば、コードを実行するだけで何もアサートしないテストでも、カバレッジは上がる。ミューテーションテストを使えば、こうしたテストを見抜ける。

仕組み

本番コードに明らかな誤りを一時的に入れ、テストを実行する。テストが失敗すれば、テストはその誤りを検出できている。テストが成功したままなら、偽陰性が起きている。

Wikipedia によると、元のプログラムとミュータントで同じテストの結果が異なれば、テストスイートはそのミュータントを「kill」したという。大量のミュータントのうちどれだけを kill できたかで、テストスイートの欠陥を見つける力を測る。kill できなかったミュータントに対してテストを足せば、その力を上げられる。書き換えの方法(ミューテーション操作)には、+ と - の取り違えのような典型的な誤りをまねるものがある。

例

Wikipedia の例では、a + b > 0 の + を - に変えたミュータントを考える。(a, b) = (-1, 2) で結果が true になることを確かめるテストがあれば、このミュータントを kill できる。

注意点

元のプログラムと常に同じ振る舞いをするミュータントを、等価ミュータントという。等価ミュータントを kill するテストは作れない。Wikipedia によると、等価ミュータントを手作業で見分けるコストは小さなプログラムでも大きく、実用化の大きな障害になっている。

関連

出典