開発支援・コーディング

カバレッジとは|行83.3%・分岐80.0%のテストが、実際の誤りは59.3%しか捕まえなかった

カバレッジは何を測っているのか行と分岐で何が違うのか何%を目標にすべきか

テスト2件で、行カバレッジは83.3%になりました。8割を超えています。

同じテストにコードの書き換えをぶつけると、気づけたのは59.3%だけでした。

この記事の要点

  • 薄いテストで行83.3%
  • 同じテストの分岐は80.0%
  • 変異の検出率は59.3%
  • 厚くしても91.7%/90.0%/88.9%

行83.3%・分岐80.0%のテストが、実際の誤りは59.3%しか捕まえなかった

カバレッジは通ったかどうかしか見ていません。通った結果が正しいかは別に確かめる必要があります。

カバレッジの数字が高いことと、テストが効いていることは別の話です。実際に走らせて差を出しました。

対象は送料の計算です。テストを2件だけ書いた薄い版と、境目の値を足した9件の厚い版を用意しました。

3つの見方で測ります。行を通ったか・分岐の両側を通ったか・コードを書き換えて気づけるかです。

3つ並べる

text
テスト            件数  行カバレッジ  分岐カバレッジ  変異の検出率
薄いテスト(2件)             2件         83.3%           80.0%         59.3%
厚いテスト(9件)             9件         91.7%           90.0%         88.9%

薄いテストの行カバレッジは83.3%です。この数字だけ見れば、そこそこ書けているように見えます。

ところが変異の検出率は59.3%です。コードを壊しても、4割は素通りしました。

通ることと確かめることは別

テスト2件は、たしかにほとんどの行を通ります。通ったあとの値を確かめていない行があるだけです。

たとえば境目の判定は、片側だけ試せば行としては通ります。境目そのものを試さなければ、そこの誤りには気づけません

出典もこの点を問題は、高いカバレッジの数字が、質の低いテストでもあまりに容易に達成できてしまうことであると書いています。

右へ行くほど厳しい見方になり、数字は下がる。

単位: %厚い・行91.7%厚い・分岐90%厚い・変異88.9%薄い・行83.3%薄い・分岐80%薄い・変異59.3%送料計算の関数での実測。変異は27通りの書き換えに対して、テストが落ちた割合。
図1 ── 同じテストを3つの見方で測った結果
出典Martin Fowler「TestCoverage」2026-08-18 確認
The trouble is that high coverage numbers are too easy to reach with low quality testing.
原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18

行と分岐は、思ったほど離れない

分岐は行より厳しい見方です。それでも変異ほどは離れず、同じ傾向を示します。

カバレッジには段階があります。行より分岐のほうが厳しいとよく言われます。

3つの見方

  1. 。その行を1回でも通ったか
  2. 分岐。条件が真の場合と偽の場合の両方を通ったか
  3. 条件。かつ・またはの各項を両方の値で通ったか
  4. 変異。書き換えたときにテストが落ちるか

下へ行くほど厳しくなります。4番目はカバレッジではありませんが、同じ軸の延長に置けます。

実際の差は小さい

この計測では、行と分岐の差は3.3ポイントと1.7ポイントでした。ほとんど動きません。

変異との差は24.0ポイントと2.8ポイントです。薄いテストほど、変異との差が開きます

厚いテストの分岐で通らなかったのは1か所です。料金が負にならないか調べる分岐で、この計算では到達しません。

数字にしないほうがよい

3つのどれを使っても、1つの数字で品質を表すことはできません。薄いテストでも8割を超えます。

出典も同じ判断をテストのカバレッジは、テストがどれだけ良いかを表す数値としては、ほとんど役に立たないと述べています。

出典Martin Fowler「TestCoverage」2026-08-18 確認
Test coverage is of little use as a numeric statement of how good your tests are.
原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18

テストされていない部分を探す道具として使う

低い数字は問題を指します。高い数字は何も保証しないので、目標にはしません。

カバレッジの使い道は1つに絞れます。通っていない部分を見つけることです。

出典もこの位置づけをテストのカバレッジは、コードのうちテストされていない部分を見つけるための有用な道具であるとしています。

見つけたあとの手順

  1. 通っていない行を出す。数字ではなく一覧を見る
  2. 心配かどうか決める。壊れたら困る行かを判断する
  3. テストを足す。心配な行にだけ足す
  4. 残りは残す。到達しない行は、そのままでよい

4番目が要点です。この計測でも、通らなかった1行はそもそも到達しない分岐でした。埋める意味がありません。

目標にしない

数字を目標にすると、数字を上げる書き方が選ばれます。確かめないテストでも、行は通ります

この計測の薄いテストがその例です。2件しかないのに、行では83.3%に届いています。

確かめているかどうかまで見たい場合は、書き換えをぶつけます。ミューテーションテストの記事で、その回し方を測っています。

低い数字は問題を指す。高い数字は何も指さない。

充足 2 / 4通っていない行を一覧で見ている数字だけでは、どこが抜けているかが分からない行と分岐の両方を出している分岐は条件の両側を見るため、行より抜けを拾える何%以上という目標を置いているテスト2件でも行83.3%に届き、数字は容易に上げられる通っていない行をすべて埋めようとしているこの計測で残った1行は、そもそも到達しない分岐だった送料計算の関数での実測にもとづく。テストは2件と9件の2通り。
図2 ── 使う前の点検項目
余談 この計測での注意

対象は20行ほどの関数1つです。行数が少ないので、1行の重みが8.3%と大きく出ます。分岐も5か所しかありません。実際のコードでは数字はもっとなめらかに動きます。ここで見せているのは、行・分岐・変異の順に厳しくなること、そして薄いテストほど変異との差が開くという関係です。

出典Martin Fowler「TestCoverage」2026-08-18 確認
Test coverage is a useful tool for finding untested parts of a codebase.
原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18

よくある質問

カバレッジは何を測っていますか
テストがその行や分岐を通ったかどうかです。通った結果が正しいかどうかは見ていません。
行と分岐はどう違いますか
分岐は、条件が真になる場合と偽になる場合の両方を通ったかを見ます。行より厳しい見方です。
何%を目標にすればよいですか
目標にしないほうが安全です。この計測では行83.3%でも、実際の誤りの4割を見逃していました。
では何に使いますか
通っていない部分を見つける道具です。低い数字は問題を指しますが、高い数字は品質を保証しません。

まとめ

  • 通ったかどうかを測る指標
  • 正しさは測っていない
  • 分岐は行より厳しい
  • 使うのは穴を探すとき

今日から始められること

  1. 行と分岐の両方を出す
  2. 通っていない行を一覧にする
  3. その行が心配かどうかを判断する
  4. 心配なところにテストを足す

実務で組んだカバレッジのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る