いつも忘れてしまうC0/C1/C2カバレッジまとめ
notwork_coverage
スポンサーリンク

C0/C1/C2カバレッジの違い

テストカバレッジ(網羅率)の種類(C0/C1/C2)まとめ

ヒーラー
C++testなどを使用してカバレッジ測定する際に、毎回忘れがちになってしまう

カバレッジとは、検査網羅率(テストカバレージ) のことを指し、どれだけテストしたかの指標を表します。
ソフトウェアテストにおいて、カバレッジ(網羅率)を測定/分析することは、ソフトウェアの品質向上に非常に大きな意味があります。
コードのカバレッジを測定し、テストが実施されていないコード(通らないプログラム)を確認することにより、テストの妥当性を向上させることができます。
一般的には、単体テストでコードのカバレッジを測定し、テストの品質を測ります。
C++testなどの静的解析ツールも出ています。

その指標の中に、網羅率ごとのC0/C1/C2カバレッジがあります。

  • C0:命令網羅(ステートメント・カバレッジ)
  • C1:分岐網羅(ブランチ・カバレッジ)
  • C2:条件網羅(コンディション・カバレッジ)

文章にすると上記のとおりなのですが、毎回忘れてしまいがちなので、コードと照らし合わせてまとめておきます。

解説

概念

int abs(int x) {
    if (x < 0) {
        x = -x;
    }
    return x;
}
C0:命令網羅(ステートメント・カバレッジ)

すべての命令を実行すればC0は100%となります。
言い方を変えると、通っていない処理がなくなればC0は100%となります。
上記のコードでは、if文の中に入ればよいことになります。

したがって上記のabs関数では、例えば x = -1のテストケース1つを作ればC0は網羅できることになります。

C1:分岐網羅(ブランチ・カバレッジ)

判定条件網羅(ディシジョン・カバレッジ)とも言われます。
すべての分岐におけるすべての方向を実行すればC1は100%となります。
したがって上記のabs関数では、例えば x = -1 と x = 0 を用いたテストケース2つあれば、分岐網羅基準にしたがってテストできたことになる。
if文に対するelse文の処理があると想定すると分かりやすいかもしれません。その場合、C0を網羅するためにもテストケースは2つ必要になります。

C2:条件網羅(コンディション・カバレッジ)

条件式(AND/ORなど複合条件であれば各々の個別条件)において、すべての可能な結果を少なくとも1回は通るように実行すれば、C2は100%となります。
注目点は条件式になるため、C2カバレッジが100%になったとしても、C0、C1が100%になるとは限りません。

if (x > 0 || y > 0) { ... }

例えば上記のような判定条件の場合、x > 0の真為、y > 0の真為の両方を考慮する必要があります。
したがって以下の4通りが必要になり、テストケースは4つ必要になります。

  • x > 0、y > 0
  • x > 0、y <= 0
  • x <= 0、 y > 0
  • x <= 0、y <= 0

ただし上記の場合、x > 0 で最初の判定が真の時点で、y > 0は判定が不要になるため、実質的には以下のテストケース3つでよいことになります。

  • x > 0、y > 0(または、x > 0y <= 0
  • x <= 0、 y > 0
  • x <= 0、y <= 0

応用

少し複雑化したコード例で考えてみます。

void function(...) {
    if ( 条件a1 || 条件a2 ) { // 判定条件A
        命令1
    } else {
        命令2
    }
    if ( 条件b ) { // 判定条件B
        命令3
    }
}

C0:命令網羅(ステートメント・カバレッジ)

上記コードでは、命令1、命令2、命令3を少なくとも1度通るべきであるということになります。
つまり、命令の数分のケースが必要ですので、命令3つの3通りが必要です。
テストケースで言えば、例えば最低以下のケース2つを作ればC0は網羅できることになります。
(※命令が3箇所ありますが、効率よく2ケースで通している)

  • 命令1、命令3を通るケース
  • 命令2を通るケース

C1:分岐網羅(ブランチ・カバレッジ)

上記コードでは、判定条件Aと判定条件Bがすべての方向に網羅できればよいことになります。
つまり、判定条件の真意の数分のケースが必要ですので、2通り×2箇所の4通りが必要です。
テストケースで言えば、例えば最低以下のケース2つを作ればC1は網羅できることになります。
(※判定条件2通り×2箇所ありますが、効率よく2ケースで通せるため結果的にC0と同じ)

  • 命令1、命令3を通るケース
  • 命令2を通って、命令3を通らないケース

C2:条件網羅(コンディション・カバレッジ)

上記コードでは、条件a1、条件a2、条件bのそれぞれの真為が網羅できればよいことになります。
つまり、条件すべての真意の数分のケースが必要ですので、2通り×3箇所の6通りが必要です。
例えば最低以下のテストケース2つを作ればC2は網羅できることになります。

  • 条件a1=false、条件a2=false、条件b=falseのケース
  • 条件a1=true、条件a2=true、条件b=trueのケース

ちなみに、上記であれば、C0、C1も網羅できますが、以下の場合にはC2を網羅できても、C0とC1は命令2が通らないため網羅できません。

  • 条件a1=false、条件a2=true、条件b=falseのケース
  • 条件a1=true、条件a2=false、条件b=trueのケース

また、C2は、複合条件網羅として混同されることがあります。
複合条件網羅の場合、全ての条件の組み合わせを考える必要があります。
つまり、以下の8ケースが考えられます。

  • 条件a1=false、条件a2=false、条件b=falseのケース
  • 条件a1=false、条件a2=false、条件b=trueのケース
  • 条件a1=false、条件a2=true、条件b=falseのケース
  • 条件a1=false、条件a2=true、条件b=trueのケース
  • 条件a1=true、条件a2=false、条件b=falseのケース
  • 条件a1=true、条件a2=false、条件b=trueのケース
  • 条件a1=true、条件a2=true、条件b=falseのケース
  • 条件a1=true、条件a2=true、条件b=trueのケース

ただし、最後の4ケースについては、条件a1がtrueの時点で、条件Bは判定されず、true/falseどちらでもよいことになるため、テストケースとしては実質的に6ケースあればよいことになります。

  • 条件a1=false、条件a2=false、条件b=falseのケース
  • 条件a1=false、条件a2=false、条件b=trueのケース
  • 条件a1=false、条件a2=true、条件b=falseのケース
  • 条件a1=false、条件a2=true、条件b=trueのケース
  • 条件a1=true、条件a2=DC、条件b=falseのケース
  • 条件a1=true、条件a2=DC、条件b=trueのケース

※DC:Don't Care(どうでもいいということ)

参考

https://www.techmatrix.co.jp/product/ctest/unittest/c2.html
https://www.techmatrix.co.jp/product/ctest/structural-code-coverage/index.html#ctest-coverage

スポンサーリンク

Twitterでフォローしよう

おすすめの記事