コードカバレッジ70%で十分?80%?90%?それとも100%?

このブログは「Is 70%, 80%, 90%, or 100% Code Coverage Good Enough?」を翻訳・一部加筆したものです。

100%ステートメントカバレッジが示す真実と示さないもの

はじめに

「カバレッジは85%です。これで問題ないでしょうか?」 

開発チームやQAの定例会議、コンプライアンス審査でよく耳にする質問です。コードカバレッジは、最も可視性が高く追跡しやすいテスト指標として定着しています。しかし重要なのは、70%、80%、あるいは100%といった特定の数値を追い求めることが、その数値が実際に何を反映しているかを理解していなければ、誤解を招く可能性があるということです。さらに悪いことに、誤った安心感を与える恐れがあります。

本記事では、これらの数値が真に意味するもの、100%のステートメントカバレッジが保証する(および保証しない)内容、そしてCocoなどのツールを活用するチームが、単なる活動測定ではなく品質向上とリスク低減のために、いかに戦略的にコードカバレッジに取り組んでいるかを解説します。

コードカバレッジの真の意味

本質的に、コードカバレッジはテスト中にコードのどの部分が実行されたかを示すものです。コードが正しく動作したかどうか、エッジケースがテストされたかどうか、あるいは決定ロジックが検証されたかどうかは示しません。また、測定するカバレッジの種類によっては、重大な盲点を見逃している可能性があります。

コードカバレッジにはいくつかの種類があります。

  • 決定/分岐カバレッジ - if と else の両方のパスが実行されましたか?
  • 条件カバレッジ – すべてのブール値のサブ条件が真と偽の両方で評価されましたか?
  • MC/DC (Modified Condition/Decision Coverage) - 各条件が結果に独立して影響を与えることが確認されましたか?

では、70%、80%、90%、あるいは100%のカバレッジは「十分」と言えるのでしょうか?

簡潔にお答えしますと、それはテスト対象の内容、テスト方法、そして使用するカバレッジ指標によって異なります。一般的な目標値について、以下のように考えてみてください。

70% カバレッジ

多くの組織における最低限の基準値です。コア機能はテスト対象となっているものの、エッジケース、エラー処理、稀な条件などは未テストの可能性があります。

80~90% カバレッジ

一般的に健全な範囲と見なされます。テストが単なる行単位の浅いヒットに留まっていない限り、確実なテスト戦略を示唆しています。特に分岐カバレッジや決定カバレッジを含める場合、Cocoユーザーはこの範囲で自信を持って運用することが多いです。

100% カバレッジ

「100% カバレッジ」は理想的な基準のように聞こえますが、測定対象のカバレッジの種類を理解している場合に限ります。

  • ステートメントカバレッジとは、実行可能なすべてのステートメントが少なくとも1回実行されたことを意味します。
  • ラインカバレッジは、ソースコードの各行が実行されたかどうかを確認します。これらはよく似ているように見えますが、同じものではありません。1行に複数のステートメントが含まれる場合もあり、また、実行不可能な行も存在するからです。

しかしながら、いずれの指標も、テストがプログラムのロジックをどれだけ徹底的に探索しているかについては何も語っていません。テストスイートは、各行を一度ずつ実行することで100%のステートメントカバレッジを達成しているにもかかわらず、決定パスの全体、テストされていない例外フロー、あるいは重要なエッジケースを見逃している可能性があります。実際、最も深刻なバグのいくつかは、分岐ロジック、エラー処理、そしてほとんど実行されない条件の中に潜んでいるのです。

100%ステートメントカバレッジが実際に意味すること

ツールが100%のステートメントカバレッジを報告する場合、その真の意味は、単にすべてのステートメントが少なくとも1回は実行されたということに過ぎません。これは、すべての分岐の結果が両方とも実行されたこと、複雑な決定条件内の個々の条件が検証されたこと、あるいはネガティブシナリオや境界値がテストされたことを意味するものではありません。言い換えれば、深みのない高いステートメントカバレッジは、誤った安心感を与える可能性があり、一方で最もリスクの高い欠陥は発見されないまま残されるのです。

簡単な例を挙げましょう。

code snippet_Coco blog

もしテストが user.is_admin = true の場合のみを確認する場合、if 文が実行され、コードカバレッジツールは 100% のステートメントカバレッジを報告する可能性があります。しかし、user.is_owner = true の場合はどうでしょうか?あるいは両方が false の場合は?両方が true の場合は?

これらの未テストの組み合わせは、ステートメントカバレッジだけでは不十分であり、分岐カバレッジ/決定カバレッジがより完全な状況を示す理由を明らかにします。

Cocoを使用すれば、決定カバレッジのみを用いてこの欠落を捕捉できます。決定カバレッジは各論理分岐が実際に実行されたかどうかを可視化します。そのため、トップレベルの数値よりもカバレッジの深さが重要となるのです。

100%を追い求める問題点

チームが100%カバレッジをまるで栄誉の勲章であるかのように追い求めることがあまりにも頻繁にあります。しかし、文脈を欠いたその目標は、深刻なトレードオフを招く可能性があります。

  • 時間の浪費:意味のある検証を行わない表面的なテストの作成
  • 焦点の逸脱:リスクの高い処理経路の検証から「簡単にカバレッジを取れる」コードへの移行
  • 見逃されるバグ:特に分岐ロジック、例外処理フロー、レガシーモジュールにおいて
  • テスト疲労:チームが質の高いテスト作成よりも、数値目標を達成することに時間を費やす状態

さらに問題なのは、一部のツールがこの行為を助長している点です。具体的には、行カバレッジのみを追跡する機能ですが、これは特に大規模なコードベースで可視性が低い場合、容易に操作されてしまう可能性があります。

一方、Cocoはこの落とし穴を防ぐのに役立ちます。単にどの行が実行されたかを可視化するだけでなく、どの論理パス、条件、分岐がテストされなかったのか、そしてそれがなぜ重要なのかを明確に示します。カバレッジを単なるチェック項目ではなく、対話へと変えるのです。

カバレッジをより効果的に活用する方法

特定のパーセンテージに固執するのではなく、高いパフォーマンスを発揮するチームは、コードカバレッジを既存の測定ではなく、不足している部分を発見するための診断ツールとして活用しています。

Cocoを活用するチームがカバレッジをより効果的に扱う方法は以下の通りです。

  • モジュールサイズだけでなく、リスクに基づいてカバレッジの優先順位を決定します
  • MC/DC(分岐カバレッジ)と決定カバレッジを活用し、ロジックが複雑なコード内の微妙なバグを検出します
  • 総量だけでなく、カバレッジの不足箇所や重複箇所をレビューします
  • ユニットテスト、統合テスト、システムテストを個別にではなく、横断的にカバレッジを追跡します
  • Cocoの視覚的レポートを活用し、カバレッジをコードレビューやテスト計画に組み込みます

つまり、カバレッジを単なる「この行は実行されたか?」という回答手段ではなく、より良い質問を投げかけるためのツールとして活用しているのです。

最終的な考察

では…70%、80%、90%、あるいは100%のカバレッジは十分と言えるのでしょうか?

その数値が重要なテストを反映している場合に限り、十分と言えるかもしれません。

カバレッジ率の高さは有用ですが、品質の証明にはなりません。Cocoのようなコードカバレッジツールを活用すれば、表面的な指標を超え、真の洞察へと至ることができます。それはバグを減らし、リリースを加速させ、監査人の要求を満たすような洞察です。

達成したと言うためだけに100%を追いかけるのはやめましょう。カバレッジを道しるべとして活用し、見落としている部分を明らかにする手段としてください。

安全上重要なプログラムのためのコードカバレッジに関する無料ガイド

Whitepaper_image

安全上重要なプログラムのためのコードカバレッジに関する無料ガイドをお読みいただき、以下の内容について学んでください。

  • 現代システムにおける安全上重要なソフトウェアの重要性
  • コードカバレッジの仕組みと、認証取得の前提条件として用いられる理由
  • ソフトウェアテストにおける最も一般的なカバレッジ指標、品質保証の観点での長所と短所、および4つの安全基準との関連性 

Cocoの取り組み:より多くのコードではなく、適切なコードをテストする

Cocoは、真の結果を重視するチームのために構築されました。組み込みシステム、安全性が極めて重要な分野、あるいは長期間運用されるレガシーコードベースに取り組むチームです。こうしたチームには推測の余地はありません。

Cocoが提供する機能:

  • MC/DCや条件カバレッジといった高度なカバレッジ指標
  • C、C++、QML、Tcl、混合コードベースなど、多様な言語のサポート
  • CI/CD統合により、カバレッジをあらゆるパイプラインに組み込み可能
  • 未テストのロジックを可視化する、明瞭でインタラクティブなレポート(単なる行数表示ではありません)
  • ISO 26262やDO-178Cなどの規格をサポートするコンプライアンスキットとトレーサビリティツール

複雑なソフトウェアシステムにおいては、100%を達成することではなく、その数値が実際に何を意味するのかを理解することが重要だからです。

コード品質の測定方法

カバレッジ率は全体像の一部に過ぎません

たとえ100%のステートメントカバレッジの意味を理解していたとしても、それはテストのパズルのほんの一片に過ぎません。真の品質を測定するには、テストカバレッジとテスト効果性も考慮し、これら3つの指標がどのように連携するかを理解する必要があります。当社のブログ記事「コードカバレッジ vs. テストカバレッジ vs. テスト有効性:何を測るべきか」では、各指標の詳細、それらの重複する部分、そしてこれらを単一の運用可能なワークフローに統合する方法について解説しております。

ブログ記事はこちら (原文

現在のテストで何が不足しているか、ご確認されませんか?

Cocoコードカバレッジの詳細はこちらをご覧ください 


Blog Topics:

Comments