テスト2件で、行カバレッジは83.3%になりました。8割を超えています。
同じテストにコードの書き換えをぶつけると、気づけたのは59.3%だけでした。
カバレッジは通ったかどうかしか見ていません。通った結果が正しいかは別に確かめる必要があります。
カバレッジの数字が高いことと、テストが効いていることは別の話です。実際に走らせて差を出しました。
対象は送料の計算です。テストを2件だけ書いた薄い版と、境目の値を足した9件の厚い版を用意しました。
3つの見方で測ります。行を通ったか・分岐の両側を通ったか・コードを書き換えて気づけるかです。
テスト 件数 行カバレッジ 分岐カバレッジ 変異の検出率 薄いテスト(2件) 2件 83.3% 80.0% 59.3% 厚いテスト(9件) 9件 91.7% 90.0% 88.9%
薄いテストの行カバレッジは83.3%です。この数字だけ見れば、そこそこ書けているように見えます。
ところが変異の検出率は59.3%です。コードを壊しても、4割は素通りしました。
テスト2件は、たしかにほとんどの行を通ります。通ったあとの値を確かめていない行があるだけです。
たとえば境目の判定は、片側だけ試せば行としては通ります。境目そのものを試さなければ、そこの誤りには気づけません。
出典もこの点を問題は、高いカバレッジの数字が、質の低いテストでもあまりに容易に達成できてしまうことであると書いています。
右へ行くほど厳しい見方になり、数字は下がる。
The trouble is that high coverage numbers are too easy to reach with low quality testing.原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18
分岐は行より厳しい見方です。それでも変異ほどは離れず、同じ傾向を示します。
カバレッジには段階があります。行より分岐のほうが厳しいとよく言われます。
下へ行くほど厳しくなります。4番目はカバレッジではありませんが、同じ軸の延長に置けます。
この計測では、行と分岐の差は3.3ポイントと1.7ポイントでした。ほとんど動きません。
変異との差は24.0ポイントと2.8ポイントです。薄いテストほど、変異との差が開きます。
厚いテストの分岐で通らなかったのは1か所です。料金が負にならないか調べる分岐で、この計算では到達しません。
3つのどれを使っても、1つの数字で品質を表すことはできません。薄いテストでも8割を超えます。
出典も同じ判断をテストのカバレッジは、テストがどれだけ良いかを表す数値としては、ほとんど役に立たないと述べています。
Test coverage is of little use as a numeric statement of how good your tests are.原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18
低い数字は問題を指します。高い数字は何も保証しないので、目標にはしません。
カバレッジの使い道は1つに絞れます。通っていない部分を見つけることです。
出典もこの位置づけをテストのカバレッジは、コードのうちテストされていない部分を見つけるための有用な道具であるとしています。
4番目が要点です。この計測でも、通らなかった1行はそもそも到達しない分岐でした。埋める意味がありません。
数字を目標にすると、数字を上げる書き方が選ばれます。確かめないテストでも、行は通ります。
この計測の薄いテストがその例です。2件しかないのに、行では83.3%に届いています。
確かめているかどうかまで見たい場合は、書き換えをぶつけます。ミューテーションテストの記事で、その回し方を測っています。
低い数字は問題を指す。高い数字は何も指さない。
対象は20行ほどの関数1つです。行数が少ないので、1行の重みが8.3%と大きく出ます。分岐も5か所しかありません。実際のコードでは数字はもっとなめらかに動きます。ここで見せているのは、行・分岐・変異の順に厳しくなること、そして薄いテストほど変異との差が開くという関係です。
Test coverage is a useful tool for finding untested parts of a codebase.原文Martin Fowler「TestCoverage」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る