条件カバレッジとは

条件カバレッジ(Condition Coverage)とは、ソフトウェアのテストにおいて、ソースコード内に存在する複合条件式(例: A && BC || D)について、その式を構成する個々の単純な条件が、テストケースの実行を通じて真(True)と偽(False)の両方の評価結果を少なくとも一度は取ったかどうかを測定するカバレッジ指を指します。

これは、より網羅的なテストを行うために、基本的なステートメントカバレッジやブランチカバレッジだけでは不十分なケースを補完することを目的とします。

条件カバレッジの基本的な概念

プログラムの品質を確保するためには、コードが意図した通りに動作するかを検証するテストが不可欠です。カバレッジ指標は、テストがコードのどの範囲をカバーしているかを定量的に示すもので、条件カバレッジはその中でも条件式の詳細な網羅性に着目します。

主な概念は以下の通りです。

  1. 複合条件式(Compound Condition): 複数の単純な条件が論理演算子(例: AND / &&, OR / ||, NOT / !)で結合された条件式です。
    • 例: if (年齢 >= 20 && 地域 == "東京")
  2. 単純条件(Simple Condition)/ 個別条件: 複合条件式を構成する、それ以上分解できない個々の条件です。
    • 例: 上記の複合条件式では、「年齢 >= 20」と「地域 == “東京”」が単純条件にあたります。
  3. 真(True)と偽(False): 条件式や単純条件が評価された結果として得られるブール値です。条件カバレッジは、これらの単純条件が真偽両方の結果を経験したかを検証します。
  4. カバレッジツール(Coverage Tool): コードを実行し、どの部分がカバーされたかを自動的に測定・レポートするソフトウェアです。条件カバレッジの測定も多くのツールでサポートされています。
  5. 網羅率(Coverage Percentage): 条件カバレッジの場合、すべての単純条件について、真偽両方の評価結果が網羅された割合で表されます。

 \text{条件カバレッジ} = \frac{\text{真偽両方が評価された単純条件の数} \times 2}{\text{全単純条件の数} \times 2} \times 100%

(実際には「評価された単純条件の真偽値の総数 / 全単純条件の真偽値の総数」で計算されることが多い)

条件カバレッジの目的と重要性

条件カバレッジは、ブランチカバレッジだけでは見落とされがちな、条件式内部の潜在的なバグを発見するために重要です。

  1. より深い論理的網羅性の確保: ステートメントカバレッジやブランチカバレッジが、コードの実行経路全体を重視するのに対し、条件カバレッジは、特定の条件式がどのように評価されるかに着目します。これにより、条件式内のロジックの欠陥をより詳細にテストできます。
  2. 条件式内の潜在的バグの発見: 例えば、if (A && B)という条件式があり、テストケースでAが常にfalseの場合、Bの評価結果がどうであっても条件式全体はfalseになります。この場合、ブランチカバレッジはfalseの経路がカバーされたと判断しますが、Bが真になるケースはテストされないままになります。条件カバレッジは、このような状況でBが真と偽の両方で評価されたことを要求するため、Bに関する潜在的な問題を見つけやすくなります。
  3. テストデータの品質向上: 条件カバレッジを達成しようとすると、各単純条件を真偽両方で評価するための多様なテストデータを考案する必要があるため、テストデータの品質向上に繋がります。
  4. 網羅的な単体テストの支援: 特定の関数やメソッド内のロジックをテストする単体テストにおいて、条件カバレッジは、その関数内の条件式が十分に検証されていることを保証する上で有効な指標となります。

条件カバレッジの例と他のカバレッジとの比較

以下の例で、条件カバレッジがどのように機能し、他のカバレッジ指標とどう異なるかを示します。

JAVA

// 例: 関数 `calculateDiscount`
public int calculateDiscount(int age, boolean isStudent) {
    int discount = 0;
    if (age >= 60 || isStudent) { // 条件式C1
        discount = 10;
    }
    return discount;
}

この例の条件式C1は (age >= 60 || isStudent) であり、二つの単純条件を含みます。

  • 単純条件1: age >= 60
  • 単純条件2: isStudent

カバレッジの比較

  • ステートメントカバレッジ:
    • 目的: 各文が実行されたか。
    • テストケース1: age = 70, isStudent = false
      • age >= 60 は True
      • isStudent は False
      • 条件式C1は True となり、discount = 10 の文が実行される。
    • 結果: calculateDiscount 関数内のすべての実行可能な文が実行されたため、ステートメントカバレッジは100%になります。
  • ブランチカバレッジ(決定カバレッジ):
    • 目的: 各分岐が真偽両方の結果を取ったか。
    • テストケース1: age = 70, isStudent = false
      • 条件式C1は True となり、True側のパスが実行される。
    • テストケース2: age = 30, isStudent = false
      • 条件式C1は False となり、False側のパスが実行される。
    • 結果: テストケース1と2の組み合わせで、条件式C1の真と偽の両方の分岐がカバーされるため、ブランチカバレッジは100%になります。
  • 条件カバレッジ:
    • 目的: 各単純条件が真偽両方の結果を取ったか。
    • 単純条件1 (age >= 60) の真偽:
      • テストケース1 (age = 70): True
      • テストケース2 (age = 30): False
      • これで単純条件1は網羅されます。
    • 単純条件2 (isStudent) の真偽:
      • テストケース1 (isStudent = false): False
      • テストケース2 (isStudent = false): False
      • このままでは、単純条件2の「True」ケースがカバーされていません。
    • 追加テストケース3: age = 30, isStudent = true
      • age >= 60 は False
      • isStudent は True
      • 条件式C1は True となる。
    • 結果: テストケース1, 2, 3の組み合わせで、すべての単純条件(age >= 60isStudent)が真と偽の両方の結果を評価されるため、条件カバレッジ100%になります。

上記の例のように、ブランチカバレッジ100%でも条件カバレッジが100%になるとは限りません。条件カバレッジを達成することで、条件式内の個々の部分がより詳細にテストされ、潜在的なロジックミスが発見されやすくなります。

条件カバレッジの限界と考慮事項

条件カバレッジは網羅性を高めますが、それにも限界があります。

  1. 条件組み合わせの網羅不足: 個々の単純条件の真偽を網羅しても、それらの組み合わせ全てがテストされたわけではありません。例えば、A && Bの場合、条件カバレッジは(A=T, B=T)(A=F, B=F)の2つのテストケースで100%を達成できますが、(A=T, B=F)(A=F, B=T)といった他の組み合わせはテストされない可能性があります。これを網羅するためには、より上位の「条件/決定カバレッジ」や「複数条件カバレッジ」が必要になります。
  2. 実行パスの網羅不足: すべての条件が網羅されても、プログラム内のすべての実行パスが網羅されたとは限りません。
  3. テストケース数の増加: 条件カバレッジを達成するためには、ブランチカバレッジよりも多くのテストケースが必要になる傾向があります。複雑な条件式が多い場合、テストケースの設計と実行のコストが増大します。

条件カバレッジ(Condition Coverage)とは、ソフトウェアテストにおいて、複合条件式を構成する個々の単純条件が、テスト実行を通じて真(True)と偽(False)の両方の結果を少なくとも一度は評価されたかどうかを測定するカバレッジ指標です。

ステートメントカバレッジやブランチカバレッジだけでは見過ごされがちな、条件式内部の潜在的なロジックの欠陥をより詳細にテストし、発見することを目的とします。これにより、テストの網羅性を高め、テストデータの品質向上にも貢献します。

しかし、条件カバレッジは個々の単純条件の網羅性を保証するものであり、すべての条件の組み合わせや、プログラムのすべての実行パスを網羅するものではないという限界も持ちます。そのため、より堅牢なテストを行うためには、他のカバレッジ指標と組み合わせて利用することが推奨されます。

関連用語

カバレッジ | 今更聞けないIT用語集
カバレッジ測定 | 今更聞けないIT用語集
ソフトウェアエンジニアリング

お問い合わせ

システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。

APPSWINGBYの

ソリューション

APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。

システム開発

既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。

iOS/Androidアプリ開発

既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。


リファクタリング

他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。