コードカバレッジとは?
コードカバレッジは、テスト実行中にソースコードのどれだけが実行されたかを報告する一連の指標です。
コードカバレッジとテストカバレッジはしばしば同じ意味で使われますが、「コードカバレッジ」は通常、行、ブランチ、関数、ステートメントといった具体的な測定の種類と、ツールがそれらをどう計算するかを指します。これらの種類を理解すると、1 つの目立つ数字に惑わされることなくカバレッジレポートを読めるようになります。
一般的なカバレッジの種類
- 行またはステートメントカバレッジ:どの行が実行されたか。
- ブランチカバレッジ:各判定の true/false のどのパスが実行されたか。
- 関数カバレッジ:どの関数が呼び出されたか。
- 条件カバレッジ:どのブール部分式がそれぞれの形で評価されたか。
インストルメンテーションの仕組み
カバレッジツールは、ソースコードの書き換え、バイトコードの変換、またはランタイムフックの利用によって、コードにカウンターを挿入します。テストが実行されると、それらのカウンターが増加します。その後、ツールは実行された内容を全体と比較して、割合と行ごとのマップを生成します。
数字が意味すること・しないこと
高い行カバレッジの数字は、テストされていないブランチを隠すことがあるため、ブランチカバレッジの方が通常はより正直なシグナルです。どの数字も、あなたの検証が正しいことを証明するものではなく、コードが実行されたことを証明するだけです。カバレッジは成績ではなく、盲点のマップとして読みましょう。
簡単な例
if/else を持つ関数は、片方のブランチしか実行されていなくても 100 パーセントの行カバレッジに達することがあり、だからこそブランチカバレッジの方がより真実に近い話を語ることが多いのです。
function classify(n) {
if (n > 0) return "positive"; // tested
return "non-positive"; // line never run
}CI におけるコードカバレッジ
パイプラインは通常、LCOV や Cobertura のような標準フォーマットでカバレッジを生成し、それを傾向を追跡して pull request にコメントするダッシュボードにアップロードします。追加のインストルメンテーションはテストをいくらか遅くするため、高速な runner で実行することでカバレッジのステップが build を占有しないようにします。
重要なポイント
- コードカバレッジは、行、ブランチ、関数、条件の指標にまたがります。
- ツールはコードをインストルメント化し、テスト中に何が実行されたかを記録します。
- ブランチカバレッジは通常、行カバレッジよりも正直なシグナルです。