概要
網羅率が低いテストスイートの質が悪いことを示せても、網羅率が高いテストスイートの質がいいことは証明できない
定義
網羅率(coverage)とは、テストスイートに含まれているテストケースが実行するプロダクションコードの割合のことです。
単体テストの考え方/使い方 p11
コード網羅率(テスト網羅率)の落とし穴
コード網羅率 = \frac{実行されたコードの行数}{総行数}
下記のテストはコード網羅率100%になるが、実際にはテストされていない振る舞いがある($inputの長さが5以上の場合)
function isStringLong(string $input): bool
{
return strlen($input) > 5;
}
function test入力文字の長さが5以下の場合falseが返る()
{
$result = $this.isStringLong(3);
}
分岐網羅率
分岐網羅率 = \frac{経由された経路の数}{分岐経路の総数}
分岐網羅率の場合、上記コードは $input
が5以上か5以下の2つの分岐があり、そのうち1つ経由されているので、分岐網羅率50%となる。
網羅率で保証できないコードの検証
以下のテストスイートは分岐網羅率100%になるが、新たに追加されたクラス変数の更新については検証されていない。
string $stringProperty;
function isStringLong(string $input): bool
{
$this.stringProperty = $input; ## 検証されない
return strlen($input) > 5;
}
function test入力文字の長さが5以上の場合trueが返る()
{
$result = $this.isStringLong(6);
}
function test入力文字の長さが5以下の場合falseが返る()
{
$result = $this.isStringLong(3);
}
確認不在のテスト
テスト対象のコードを実行するだけで何も確認しないテストのことを 確認不在のテスト という。
下記のテストも分岐網羅率100%になるが全く意味がないテストになってしまっている。
function test()
{
$result = $this.isStringLong(6);
$result = $this.isStringLong(3);
}
上記は極端な例だが、ある網羅率をプロジェクトの必須目標に設定した場合、このようなテストで網羅率をカバーし始める可能性がある。
使用するライブラリ内のコードは網羅率から外れる
たとえここまで示した例で分岐網羅率を100%にし、すべての振る舞いを検証したとしても、実は全てのコードを網羅していない。
上記の例ではphpの組み込み関数 strlen()
を使用しているが、この関数を実装しているコードの分岐網羅率は考慮から外れてしまっている。
これはライブラリ内のコードを全て検証すべきというわけではなく、網羅率からはテストが十分に行われていることは本当の意味で知ることができないということである
=網羅率の高さからはテストスイートの質の良さを示せない
参考文献
単体テストの考え方/使い方 p10~19