テストカバレッジとは何か?チームにとって十分な水準はどこか?

テストカバレッジは、ソフトウェア品質においてよく引用される指標のひとつですが、最も誤用されやすい指標のひとつでもあります。チームはコードカバレッジ80%という目標を追いかけ、70%が許容できるかどうかを議論し、その数値が実際に何を意味するかを深く考えずにカバレッジをマージ要件にしてしまうことがあります。
このガイドでは、テストカバレッジが何を測定し、何を測定しないか、そして単に指標を「こなす」のではなく、真の品質向上につながるカバレッジの考え方について解説します。
テストカバレッジとは何か?
テストカバレッジは、テストスイートを実行したときにコードベースのどの割合が実行されるかを測定します。最も一般的な形式は行カバレッジまたはステートメントカバレッジで、少なくとも1つのテストによって実行されるコード行の割合を示します。
その他のカバレッジの種類:
- ブランチカバレッジ:各条件分岐(if/else)の両方のブランチがテストされているか?
- 関数カバレッジ:各関数が少なくとも1回呼び出されているか?
- パスカバレッジ:コードを通るすべての実行パスがテストされているか?(指数関数的に複雑になるため、実際にはほとんど測定されない)
ほとんどのCI/CDカバレッジレポートは行カバレッジを表示します。これは最も測定しやすく、最もよく引用される指標です。
テストカバレッジが実際に示すもの
コードカバレッジが高いということは、テストスイートがコードのほとんどを少なくとも1回実行していることを意味します。これは有用なシグナルです。テストで一度も実行されないコードは、テストで検証することができません。
ただし、カバレッジには重要な限界があります:
カバレッジはテストの品質を何も示しません。関数を呼び出してもアサーションを何も行わないテストは、行カバレッジを100%にまで引き上げながら、バグを1つも検出しません。カバレッジは実行を測定するのであって、正確さを測定するものではありません。
カバレッジは要件カバレッジを何も示しません。50のテストから呼び出される関数でも、完全に誤った動作を実装している可能性があります。50のテストすべてが誤った実装を確認してしまいます。カバレッジが高いからといって、コードが期待通りに動作しているわけではありません。
カバレッジ100%でもバグがないことを意味しません。それはすべての行が実行されたことを意味するだけです。ある行が正しく実行されても、誤ったロジックを実装している可能性は十分あります。
これが、Andrew NgをはじめとするいくつかのAI開発のリーダーたちが、カバレッジ指標よりも規律ある評価プロセスを重視する理由です。重要な問いは「何%の行がカバーされているか」ではなく、「何%の要件が検証されているか」です。
カバレッジ指標と要件カバレッジ
ソフトウェア品質にとって最も重要なカバレッジ指標は、ほとんどのツールが測定していないものです。それは要件カバレッジ、つまり製品の仕様として定められた振る舞いのうち、テストによって検証されている割合です。
要件カバレッジは、行カバレッジが見逃すクラスのバグを捕捉します。コードは実行されているが誤った処理が実装されているという「意図のギャップ」です。「未認証のユーザーはログイン画面にリダイレクトされる」という要件から導かれたテストは、特定の動作を検証します。一方、認証ミドルウェアが「カバーされている」ことを示す行カバレッジ指標では、すべてのケースで正しくリダイレクトされているかどうかを確認することはできません。
これがTestSpriteのアプローチの核心です。行カバレッジを測定するのではなく、TestSpriteは要件カバレッジを測定します。PRDやユーザーストーリーを起点に、各仕様の振る舞いに対するテストを生成し、それらのテストに対して実装を検証します。
ベンチマークの内容は明確です。AIが生成したコードは、初回実行時に要件テストの42%しかパスしません。これは「42%のコード行がカバーされていない」という意味ではなく、「58%の要件が満たされていない」ということです。この二つはまったく異なる問題であり、要件カバレッジのみがその後者を検出できます。
「十分な」カバレッジとはどの水準か?
適切なカバレッジ水準は、何を測定し、何を守ろうとしているかによって異なります。
ラインカバレッジについて:70〜80%は本番ソフトウェアにおける一般的な最低基準として挙げられます。50%未満はテストされていない領域が多いことを示します。90%超は価値がありますが、リターンは急速に逓減します。最後の10%は多くの場合、デッドコード、生成されたコード、または品質に実質的な影響を与えない trivial なコード行をカバーするだけです。
クリティカルパスについて:重要なユーザーフローに対しては100%のカバレッジが正しい目標です。認証、決済、データ整合性——これらの領域での障害は深刻な影響をもたらすため、完全なテストカバレッジが必要です。
要件カバレッジについて:指定されたすべての要件に対して、少なくとも1つのテストが存在すべきです。要件が満たされていることを検証できない場合、その要件について自信を持って断言することはできません。
エッジケースについて:ここが多くのカバレッジ議論が混乱するポイントです。エッジケースのカバレッジはラインカバレッジメトリクスでは適切に把握できません。TestSpriteのようなAIテストプラットフォームは、標準カバレッジの一環として、要件から明示的にエッジケーステストを生成します——空の入力、境界値、同時並行操作、エラー条件などが含まれます。
よくあるカバレッジのアンチパターン
品質チェックなしにカバレッジをマージの条件にすること。マージ前に80%のカバレッジを要求すると、品質向上のためのテストではなく、カバレッジを増やすためのテストを書くインセンティブが生まれます。開発者は、意味のあるアサーションなしにコードを実行するだけのテストを書くことを学んでしまいます。
テスト品質を犠牲にして100%を追求すること。カバレッジの最後の10%は多くの場合、最も価値が低い部分です。その追求に費やす時間は、クリティカルパスの要件ベーステストに充てた方が有益です。
エラーパスのカバレッジを無視すること。ハッピーパスのラインカバレッジは達成しやすいです。エラーパス——APIの失敗、バリデーションエラー、認証失敗——はテストが難しく、カバレッジが大幅に低くなりがちです。また、最も重要なバグが潜んでいるのもこの部分です。
カバレッジを「何をテストすべきか」を考える代替として扱うこと。カバレッジメトリクスは有用なサニティチェックです。しかしテスト戦略にはなりません。何をテストするか——どの要件、どのエッジケース、どの統合ポイントか——は、カバレッジの数値では提供できない判断力を必要とします。
AIテストツールで意味のあるカバレッジを実現する
TestSpriteは、従来のツールとは異なるアプローチでカバレッジを実現します。実行されたコード行を測定するのではなく、要件から出発し、各要件に対して検証可能なテストカバレッジが存在することを保証します。これにより、ダッシュボード上の数値は高くてもバグが見逃されるようなカバレッジではなく、品質にとって真に意味のあるカバレッジが得られます。
TestSpriteをリポジトリに接続し、要件を提供するだけで、製品が実際に何をできて何をできないかを示す要件ベースのカバレッジが得られます。
こちらから始める →