TL;DR

テストスイートを実行したときに、プログラムのソースコードのどれだけの割合が実行されたかを表す指標。テストカバレッジとも呼ぶ。

なぜ必要か

Wikipedia によると、カバレッジが高いほど、見つかっていないバグが残る可能性は一般に低くなる。ソフトウェアテストの最初期の体系的な手法の 1 つで、最も古い文献は 1963 年の Miller と Maloney の論文である。

仕組み

何を「実行された」とみなすかで、いくつかの基準がある。

  • 関数カバレッジ: 各関数が呼ばれたか
  • 命令(ステートメント)カバレッジ: 各文が実行されたか
  • 分岐カバレッジ: 各分岐の両方の結果を通ったか
  • 条件カバレッジ: 各真偽値の部分式が真と偽の両方になったか
  • MC/DC: 各条件が単独で判定の結果を変えることを示せたか。航空機などの安全性が重視される分野で求められる

例

Jest では --coverage を付けるとコードカバレッジを計算する。Effective Rust 項目32 によると、Rust では cargo tarpaulin で測れる。前回の結果と比べないとテスト不足を検出できないので、Codecov などの外部の追跡システムと連携する。

注意点

カバレッジが高くても、正しく動くことは保証されない。Wikipedia は、数字を上げるためだけにテストが書かれることを懸念する Martin Fowler の「100% のようなものは疑わしい」という言葉を引いている。何もアサートしないテストでもカバレッジは上がるので、テストの実効性はミューテーションテストで確かめる。また、計測のための処理が負荷を足すので、普通は本番ではなくテストのときに使う。

関連

出典