ナレッジ

テストカバレッジとは。C0とC1の違いや正しく選ぶことの重要性を解説

テストカバレッジとは。C0とC1の違いや正しく選ぶことの重要性を解説

テストカバレッジは、ソフトウェアテストで「どこまでテストできたか」を数値で示すための指標です。

この記事では、代表的なコードカバレッジ(C0、C1、C2)から、統合テスト・システムテスト・受け入れテストで用いられるカバレッジまでを体系的に整理し、テスト計画や管理、品質評価にどのように役立てるべきかを解説します。

テストカバレッジとは

テストカバレッジ(Test Coverage)は、ソフトウェアテストにおいて、テストの網羅度を測定するために用いられる指標値のことで、網羅率とも呼ばれます。その名の通りパーセントで表します。テスト対象やテストアイテムに対してテストすべき事柄をどれくらいテスト実行しているかを表す割合、ということができます。

一般的にテストカバレッジというと、コードカバレッジ(C0、C1、C2)が浮かびます。しかし、これ以外にもさまざまなテストカバレッジがあり、テストレベルごとに異なるものが用いられます。

本記事では、これらのカバレッジの説明と共に、それぞれどのように用いられるかを解説します。

ユニットテストで用いられるカバレッジ

以下にユニットテストで用いられるカバレッジを紹介します。

C0、C1、C2は、コードカバレッジ、あるいは構造カバレッジと呼ばれ、ホワイトボックステストで用いられるカバレッジです。コードに対するテストケースでの実行の割合を表します。

C0 ステートメントカバレッジ(Statement Coverage)

命令網羅と呼ばれます。テスト対象のコード中の命令文に対する網羅率です。このカバレッジが100%になると、コード中の全ての命令文が少なくとも1回実行されたことになります。コードカバレッジの中で最も簡単に達成できるカバレッジです。

C1 デシジョンカバレッジ(Decision Coverage)

分岐網羅と呼ばれます。コード中の分岐に対しての網羅率を表します。このカバレッジを達成するには真と偽の両方が実行される必要があります。

C2 コンディションカバレッジ(Condition Coverage)

条件網羅と呼ばれます。複合条件式に含まれる条件式それぞれが、真と偽の両方の結果が実行されている必要があります。これは複数の組み合わせが発生し、デシジョンカバレッジに比べ、多くのテストケースが必要になります。

コードカバレッジのC0、C1、C2には、それぞれメリットとデメリットがあります。C0はテストケース数が最も少なく済むため、低コストで実行できます。しかし、分岐条件や例外的な処理など、テストで網羅されない処理が多いため、バグを見逃すリスクがあります。C2は逆に、メリットとしてバグを検出できる可能性が最も高くなりますが、多くのテストケースが必要になり、コストは高くなります。

どれを用いるべきかは、テスト対象の条件(プロダクトによっては国際標準や法規)やプロジェクトの条件などにより決めます(図表1)。

カバレッジ

特徴

コスト

導入の目安

C0

命令文を網羅

迅速なテスト、低コストを優先する場合

C1

分岐を網羅

一般的なプロジェクト、品質とコストのバランスが良い

C2

複合条件を網羅

信頼性が最優先されるシステム

図表1:コードカバレッジの特徴

その他のコードカバレッジ

C0、C1、C2以外にも以下のカバレッジが用いられることがあります。

MC/DC(Modified Condition/Decision Coverage)

安全が重視される分野で用いられ、DO-178C(民間航空機ソフトウェア認証基準)やISO 26262(自動車機能安全規格)などの国際標準において高い信頼性や安全性が求められるプロダクトに対する基準の一つとなっています。

複合条件カバレッジ(Multiple Condition Coverage)

複合条件式に含まれる真と偽の全ての組み合わせを網羅します。網羅性の高いカバレッジですが、条件の数が増えると指数関数的にテストケース数が膨大になります。

パスカバレッジ(Path Coverage)

対象のコードの、開始から終了までの全てのパスに対して実行されたテストケースの割合です。コード中の分岐を通って終了に至る一連の処理をテスト実行します。

ここまでで紹介したコードカバレッジは、主にユニットテストで用いられます。それでは、他のテストレベルではどのようなカバレッジが用いられるのでしょうか。それぞれのテストレベルで用いられるカバレッジを見てみましょう。

統合テストで用いられるカバレッジ

以下に統合テストで用いられるカバレッジを紹介します。

インターフェースカバレッジ

複数のコンポーネントがやり取りする、インターフェースの網羅率の指標です。API、関数の呼び出し、通信路、データ形式などに着目します。定義されたインターフェースが最低一度呼び出されることが条件となります。

データカバレッジ

入力データ、システム内部データの網羅率の指標です。入力値のバリエーション、内部状態やフラグの網羅性、データ構造・組み合わせ網羅といった観点があります。主な観点は図表2のとおりです。

観点

目的(何を網羅するか)

具体的なチェック例

入力値のバリエーション網羅 

システムの境界値や同値クラスなど、定義された入力値に対して想定されるパターンがテストされていることを証明する。 

最小値/最大値、有効/無効な値、ゼロ、空文字、特殊文字、桁数の上限下限 

内部状態・フラグの網羅性

プログラム内部の状態遷移や変数が、想定されるパターンをたどったことを証明する。

内部フラグ(ON/OFF)、ステータス変数(未処理/処理中/完了)、メモリ状態、キャッシュの状態

データ構造・組み合わせ網羅

複数のデータや要素が連携する際の、想定した組み合わせがテストされていることを証明する。

配列やリストの長さ(0, 1, n個)、データベースのテーブル間の参照関係、JSON/XMLなどのデータ構造

図表2:データカバレッジの観点

構造カバレッジ 

統合テストレベルにおける構造カバレッジでの網羅に対する考え方はコードカバレッジと同様ですが、複数のモジュール、クラス、サービス間のインターフェースを対象とし、実際に連携して動作した時に、コードのどの部分が実行されたかを測定します(図表3、図表4)。

図表3:ユニットテストにおけるコードカバレッジ
図表3:ユニットテストにおけるコードカバレッジ
図表4:統合テストにおけるコードカバレッジ
図表4:統合テストにおけるコードカバレッジ

システムテストで用いられるカバレッジ

以下にシステムテストで用いられるカバレッジを紹介します。

機能カバレッジ

システムに定義されている機能に対するカバレッジです。全ての機能に対してテスト実行できた割合を評価します。

要求カバレッジ

要求定義書やユーザーストーリーに対するカバレッジです。これらが全てテストできているかを評価します。

ユースケースカバレッジ

ユーザーによるシステムの使われ方を想定したシナリオについて全てテストできているかを評価します。

受け入れテストで用いられるカバレッジ

以下に受け入れテストで用いられるカバレッジを紹介します。

要求カバレッジ

顧客・ユーザーの要求項目(要件定義・受け入れ基準)がテスト実行されたかを評価します。

業務シナリオカバレッジ

実際にシステムを利用するユーザーの、業務の流れやユースケース、ユーザーシナリオがテストされたかを評価します。

業務フローカバレッジ

システムや業務プロセス全体の流れを業務シナリオ化したものを基に、業務フローを用いて体系的に記述し、そのフローの分岐や経路がテストされたかを評価します(図表5)。

カバレッジ

業務シナリオカバレッジ

業務フローカバレッジ

主な対象

特定のユーザーや役割がシステムを利用する際の具体的な一連の操作・ストーリー。

システムや業務プロセス全体の論理的な流れ、分岐、経路。

評価目的

ユーザーの主要な利用パターンや業務上の重要なケースがテストされているかを確認する。

業務プロセスにおける全ての可能な判断や経路がテストされているかを確認し、プロセスの網羅性を証明する。

観点

「このユーザーがこの目的を達成するための操作経路」が網羅されているか。

「この業務プロセスが全ての分岐条件(Yes/No、複数選択など)を通り、最終的な結果に至るか」が網羅されているか。

利用シーン

受け入れテスト、ユーザビリティテストなど、ユーザー視点での確認が重要な場面。

システムテスト、受け入れテストなど、業務プロセスの網羅性やロジックの正確性が重要な場面。

図表5:業務シナリオカバレッジと業務フローカバレッジの違い

機能カバレッジ 

システムに実装された機能についてテストされたかを評価します。ここでの機能は、コードレベルではなく、要求仕様に対してシステム化されたテスト対象がどのように振る舞うかを確認します。

カバレッジを正しく選ぶことの重要性

カバレッジそのものは、それぞれが指し示すものに対してテストケースがどれくらいカバーできているかを表します。

今まで取り上げたカバレッジは、各テストレベルで必ず取り入れなければいけないわけではありませんし、そのカバレッジを100%にすれば無条件で品質が上がる、というものでもありません。プロダクトやプロジェクトの目的、品質目標、リスクを検討した上でテストによって何を達成したいのか、ステークホルダーに対して品質の指標として何を提示すべきかを考えて、どのカバレッジを採用するかを決定する必要があります。

テストレベルごとに明確な目的を設定し、テスト活動で何を保証するのかを検討してテスト計画を立案し、テスト戦略を作成します。組織としてのガイドライン(テスト方針や組織のテスト戦略)などの定義があれば、それに従ってテスト計画に盛り込みます(図表6)。

図表6:テストレベル、テスト戦略、テスト計画、組織としての品質ガイドラインの関係
図表6:テストレベル、テスト戦略、テスト計画、組織としての品質ガイドラインの関係

テスト計画とカバレッジ

テスト計画を策定する場合は、テスト戦略を具体的に実行可能な形に定義していきます。そしてテスト戦略で、カバレッジをどこまで満たすべきかを決定します。テストの終了基準として明確な形でカバレッジを定義します。

テスト設計とカバレッジ

テスト戦略で定めたカバレッジを、テスト計画で定めた水準まで満たせるようにテストを設計してきます。カバレッジはテストケース作成のための指針として機能します。

テスト実行とカバレッジ

テスト実行により、適用したカバレッジがどの程度達成できたかによって、テスト計画に対するテスト実行での達成度合いを確認または評価できます。

テストプロセス

テストカバレッジの役割

概要

テスト計画

目標設定と終了基準の定義

・どのテストレベルで、どの種類のカバレッジを、どの程度の目標値で達成するかを決定
・テストの終了基準の一つとしてカバレッジの目標値を定義し、計画書に記載

テスト設計

テストケース作成の指針

・テスト計画で定めたカバレッジ目標を達成できるように、テストケースの網羅性を意識して設計する
・特定のデータカバレッジ観点(境界値、組み合わせなど)を満たすようにテストデータを選定する

テスト実行

進捗確認と達成度合いの測定

・テストケース実行の結果としてどれだけのカバレッジが達成されたかを測定・記録する
・テスト実行中または終了後に、測定したカバレッジをテスト計画で定めた目標値と比較し、テストの進捗状況や網羅度合いを評価する
・未達部分があれば、追加テストを検討する

図表7:テストプロセスごとのテストカバレッジの役割

品質とカバレッジ

どのカバレッジをどのプロセスで、どれくらい達成するか、という基準を適切に設定すれば、各テストプロセスの指標として用いることができます(図表7)。また、テスト実行後、品質を推し測るためにカバレッジを用いることもできます。

テストをどれだけ網羅的に実行したかが数値として分かるため、その時点のテスト対象やテストアイテムの品質を評価できます。ただし、適切なカバレッジを用いていない場合、十分に不具合を検出できていない可能性があります。

また、適切なカバレッジが用いられていても、テストケースが妥当でない場合、十分なテストを行ったとは言えません。非機能特性のように、システムの振る舞いや特性を評価しなければならない場合、カバレッジでは測れないからです(図表8)。

項目

カバレッジが担保できること

カバレッジが担保できないこと

網羅性

テスト対象(コード、要求、機能など)の実行範囲の広さを客観的な数値で示せる。

テストケース自体の妥当性・有効性。単なる実行だけでなく、テストの深さが適切かどうかは測れない。

指標・管理

テストの終了基準や進捗の達成度合いとして、明確な指標を設定できる。

テスト戦略の正しさや、リスクベースのテストが正しく実行されたか。戦略に基づく質の高いテストがされたかは測れない。

品質特性

機能の実行や構造的な網羅(ホワイトボックス的な側面)。

非機能特性(性能、セキュリティ、ユーザビリティなど)のシステムの振る舞い。

テスト範囲

テスト計画やテスト戦略で定めた範囲がカバーされたことの確認。

テストケースが網羅していない領域に潜む未知のバグの検出や、バグの発生率そのもの。

図表8:カバレッジが担保できること・できないこと

このようにテストカバレッジは、どこをテストしたかを表すための指標です。適切なテスト戦略により、妥当な深さのテストが行われたかはカバレッジの数値だけでは判断できません。

テストカバレッジを有効に用いて品質向上を

テストカバレッジは、テスト対象に対してどれだけテストしたかを表す指標です。品質を向上させるために、このカバレッジを達成すべき目標として捉えず、テストの目的から導かれたテスト戦略に基づく指標として用いることにより、適切なテストを実行できるようにしましょう。

さらにカバレッジだけに頼らず、テストの妥当性や非機能特性を考慮したテスト技法を組み合わせることで、効果的に品質を向上させることを心掛けましょう。

SNSシェア

この記事は面白かったですか?

今後の改善の参考にさせていただきます!

Search Articles By The Cast出演者/執筆者から記事を探す

Search Articless By The Categoryカテゴリから記事を探す

Ranking

ランキング

もっと見る