ミューテーションテストの概要と類似手法との違い

ミューテーションテストとは、テストの有効性を評価するための手法です。テスト対象を変更し(バグを埋め込み)、それによってテスト結果が変化するかを調べることで、テストがバグを見つけられるかを評価します。
ユニットテストなどホワイトボックステストを対象した手法ですが、派生的にDSLやモデルのテストに適用したり、コンテナといった環境の条件設定に適用したりする事例もあります。

ミューテーションテストのアイデア自体は1970年代からあり、1980年代の"Hints on Test Data Selection: Help for the Practicing Programmer"でミューテーションの命名が行われ、手法として整理されました。

ソフトウェア開発では主に学術サイドで活発な研究や実践が続けられています。ICSTといったソフトウェアテストの学会では発表のそれなりの割合を占める活発なテーマとなっていて、専用のカテゴリや特設イベントが設けられているのをよく見ます。

ミューテーションテストの基本的な進め方

1. テストを実行しテスト結果を得る
2. ミューテーション操作(Mutation Operator。テスト対象を変更しバグを埋め込むやり方)に基づいてミュータント(ミューテーション操作によって変更されたテスト対象)を生成し、テストを実行してテスト結果を得る

ミューテーション操作は、網羅的なミューテーションテストを効率的に行うために、自動処理で実行できるものが一般的に選ばれます。
代表的なミューテーション操作として以下があります:

  • 判定処理の変更
    • >=、<=といった比較演算子の置換、ブール値あるいはブール演算子の反転、境界値の変更など
  • ステートメントを挿入(例えばコードを複製する)したり、削除したりする
  • 演算の変更
3. ミューテーション操作によってテスト結果が変化したか評価する

前提用として、ミューテーション操作によりテスト結果が変化することをテストが補足できたら、ミュータントをキルできたとみなします。

包括的な評価アプローチとして、ミューテーションスコア(あるいはキルスコア)の評価があります。これは、ミュータントの総数で、キルできたミュータントの数を割った割合値です。テストカバレッジと複合して評価し、ざっくりテストが妥当か、ミューテーション操作の選択が問題ないか判断します。
等価ミュータントの問題などに起因して、ミューテーションスコアが厳密にテストの品質を表現できない場合もあるため、あくまで俯瞰的な評価に用いられます。

厳密に評価するには、キルできなかったミュータントを調べ、その場合に対するテストが妥当か確認していくアプローチを取ります。

ミューテーションテストの用途

ミューテーションテストの主要な用途として以下があります:

  • バグを見つけられないテストの識別。キルできなかったミュータントを調べ、それをテストで見つけるべきだったか評価します。
    • 全くミュータントを検出できないテストを調べることで、無駄なテストの特定にも活用できます。
  • テストの網羅性の不足の識別。ミューテーションテストでのテストカバレッジを調べ、テストが網羅できていないテスト対象の領域を特定します。
  • ミューテーション操作の妥当性の評価。ミューテーションテストにおけるテストカバレッジやミューテーションスコアを評価して、ミューテーションテストのやり方がそもそも有効なのかを評価します。

類似手法との違い

テスト対象にバグを埋め込む手法としては、今回のミューテーションテストのほかに、フォールトインジェクションやエラーシーディングがあります。

ミューテーションテストは、ミューテーション操作でテスト対象を改変しミューテーションスコアで評価する、というように具体的にアプローチが規定されています。
一方で、フォールトインジェクションやエラーシーティングは障害や不具合を埋め込むアプローチを大まかに指す言葉です。そのため、この2手法とミューテーションテストは包含関係にあるとも言えなくもありません(筆者もこれまでテストの評価アプローチとして、ミューテーションテストを含むものとしてフォールトインジェクションの用語を使っていました)。が、微妙に目的や適用範囲が異なります。

※参考情報として、ミューテーションテスト、フォールトインジェクション、エラーシーディングといった、不具合を埋め込む手法を包括した呼び名として、エラー指向テスト、エラー指向アプローチという言葉があります。

ミューテーションテストとフォールトインジェクションの違い

ミューテーションテストはテスト対象に変異を埋め込み、テストを評価します。
一方で、フォールトインジェクションは、テスト対象に障害を埋め込むだけでなく、テスト対象外に障害を埋め込むやり方も一般的です。後者は、主にテスト対象の障害許容性や障害対応処理を評価したり、テスト対象に組み込まれたサニティテストが有効か評価したりする用途で活用されます。

ミューテーションテストとエラーシーティングの違い

ミューテーションテストはホワイトボックステストの評価に使用します。
エラーシーティングは、主にテストプロセスやテスト工程の評価に使用します。目的はテストの有効性評価だけでなく、残留不具合の推定や、将来的な流出不具合の見積もりを行うために実施されます。