テストカバレッジとは?
テストカバレッジは、コードのどれだけがテストによって実行されるかを測定するもので、通常は行、ブランチ、関数の割合として表されます。
テストカバレッジは人気のある指標ですが、誤解されやすいものでもあります。実行中にテストがコードのどの部分に触れたかを示すため、テストされていない箇所を見つけるのに役立ちます。一方で、それらのテストが本当に正しいことを検証しているかどうかは示せないため、判断の出発点であって判断そのものの代わりにはなりません。
カバレッジが測定するもの
カバレッジツールはコードをインストルメント化し、テストスイートを実行して、どのステートメント、ブランチ、関数が実行されたかを記録します。結果は割合と、どの行がどのテストからも到達されなかったかを正確に示すファイルごとの内訳です。
なぜ高いカバレッジが目標ではないのか
コードは意味のある検証を受けずにテストによって実行されることがあります。関数を呼び出すだけで何も検証しないテストでも、カバレッジには算入されます。つまり、弱い検証で 100 パーセントのカバレッジを達成するよりも、鋭い検証で 70 パーセントの方が優れている場合があります。カバレッジは何がテストされていないかを示すのであって、何が十分にテストされているかを示すものではありません。
カバレッジを上手に使う
- 低いカバレッジは、ギャップを照らす懐中電灯として扱いましょう。
- 些細なテストで見栄えの良い数字を追い求めないようにしましょう。
- 絶対値だけでなく、時間の経過に伴う傾向を追いましょう。
- リスクの高い、複雑な、または重要なコードにカバレッジを集中させましょう。
簡単な例
coverage.py や nyc のようなツールは一目で読めるレポートを出力し、どのテストも到達しなかった行がファイルごとに強調表示されます。
Name Stmts Miss Cover
----------------------------------
cart.py 42 3 93%
checkout.py 58 12 79%CI におけるカバレッジゲート
多くのパイプラインは、カバレッジが閾値を下回ったり、変更された行で低下したりすると build を失敗させます。これによりテストされていないコードが紛れ込むのを防げます。レポートの生成とアップロードには少し時間がかかりますが、高速な runner がそれを吸収するため、ゲートがフィードバックループを遅らせることはありません。
重要なポイント
- カバレッジは、テストが実行するコードを割合として測定します。
- 高いカバレッジは、良い検証や良いテストを保証しません。
- 見栄えの良い目標値としてではなく、ギャップを見つけ傾向を追うために使いましょう。