「ミューテーションテスト」とは?アジャイル開発の時代に重要性が増している単体テスト。単体テストの確からしさを検証する「ミューテーションテスト」を紹介
アジャイル開発においては、開発のマネジメント方法や品質保証の考え方も変化し、従来のウォーターフォールモデルにおけるVモデルでのテストが適用しにくくなっています。アジャイル開発の恩恵を受けるためには、継続的及び開発と同時にテストをし続ける事が必要になり、単体テストの重要性が増しています。
重要性が高まるということは、ただ単体テストを書くだけではなく、単体テスト自体の品質を定量的に測る必要があります。
例え単体テストの網羅率が100%だとしても、期待値の設定を誤っていたり、もしくは設定自体していないテストコードになってはいませんでしょうか。ミューテーションテストでは、そんな単体テストの確からしさを計測することができます。
このコラムでは、これからのソフトウェアテストでお勧めするミューテーションテストについて紹介します。
目次
ミューテーションテストとは
そもそも「ミューテーションテスト」という単語に馴染みのない読者も多いのではないでしょうか。JSTQBの用語集(Version 2.3.J01)では、「ミューテーション解析(mutation analysis)」を以下のように定義しています。
ミューテーション解析(mutation analysis)
テストスイートの完全性を判定する手法の一つ。プログラムのわずかな変形(変異)をテストスイートがどの程度識別できるかを測定する。
この手法を活用し、ソースコードに対して作為的にエラーコードを入れることで品質を見える化するテスト手法を、ミューテーションテストと呼びます。
ミューテーションテストは、ソースコードに対しミューテーションテストツールで作為的にエラーコードを入れることで品質を見える化するソフトウェアテストサービスです。
なお、「ソフトウェア品質を高める開発者テスト(改訂版) 著:高橋寿一」にて述べられておりますが、ミューテーションテストは1980年に考案され他のテスト手法と比べても特に新しいテスト技法ではありません。今まで殆ど注目されなかったテスト手法ではありますが、Googleでも採用されており、今後注目されるテスト技法です。
ミューテーションテストは何をするのか
ミューテーションテストはまず「単体テストが全て通っていること」が前提となります。大まかに流れを説明します。
まず、単体テストを全て通ったソースコードに対し、ミュータント (バグ)を仕込みます。そのソースコードには強制的にバグが埋め込まれているので、その単体テストを実行すると当然失敗します。しかしながら中にはバグが埋め込まれているにも関わらず、単体テストが成功するケースがあります。
その単体テストケースは、網羅していない、もしくは網羅はしているが期待値をチェックしていない、期待値が書かれていない単体テストケースであることが考えられるため、単体テストに不備があるということが言えます。
ミューテーションテストツールのPitestを使ってみる
ミューテーションテストツールにPitestというものがあります。ミュータントを埋め込んだ単体テストに対し、このツールでミューテーションカバレッジを計測することができます。
ミューテーションカバレッジは、テストされたミュータントの数/生成できるミュータントの数 で現すことができます。
以下のProject Summaryの「Mutation Coverage(ミューテーションカバレッジ)」の欄を見ると「56%」という数字が出ています。ミュータントをいれたテストをパスすることを、ミュータントをKillすると言いますが、Mutation Covarage「56%」は、埋め込んだミュータントに対してミュータントをkilledした数が56%ということを示しています。
ミューテーションのバリエーションとミューテーションカバレッジ
ミューテーションカバレッジは、どのミュータントをどのくらい埋め込むのかによっても変わってきます。ミューテーションのバリエーションが非常に多いのと、国際的なスタンダードも存在しないため、抽出する所が肝となってきます。
なお、ミューテーションテストを実施した際に、例外処理等でどうしても分岐を通らないルートが20%くらい存在するため、ミューテーションカバレッジ80%を合格基準ととらえる考え方もあります。ただ、対象のコードの性質によっても異なるため、何%を合格基準とするかはプロダクトよりも更に小さい単位で定義するのが良いとも言えるようです。
ミューテーションテストの課題
ミューテーションテストを行うには開発のスキルが必要です。且つミューテーションテスト自体の説明を開発者にする所から始めることを考えると、導入は少しハードルの高いものかもしれません。
また、誤検知が発生するため、テスト結果の内容は全て確認していく必要があります。(ミューテーションテストに限った話ではありませんが。) ただそういった導入への敷居の高さがあったとしても、ミューテーションテストは単体テストの品質を向上するものであるため、コーディングと同時にテストを行うアジャイル開発における品質向上の施策としてかなり効果的な手法であると言えます。
単体テストを「ちゃんと」やっているのに、品質が上がらないと感じている方がいれば、ミューテーションテストの導入を検討してみるといいかもしれません。