テストカバレッジ

テストカバレッジ

テストカバレッジについて説明する。
サンプルコードはJavaで記載している。

テストカバレッジとは、所定の網羅条件がテストによってどれだけ実行されたかを割合で表したもので、網羅条件には以下の種類がある。

名前 略称
命令網羅(Statement Coverage) C0
判定条件網羅(Decision Coverage) C1
条件網羅(Condition Coverage) C2
判定条件/条件網羅(Condition/Decision Coverage) CC/DC もしくは CDC
改良条件判定網羅(Modified Condition/Decision Coverage) MC/DC
複合条件網羅(Multiple Condition Coverage) MCC
経路組み合わせ網羅(Path Coverage) -

命令網羅(Statement Coverage:C0)

全ての命令文(処理)が少なくとも一回実行されるようなテストを実施する。

例1

public void doSomething(int x) {
    if (x % 5 == 0) {
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

命令網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 処理1の実行 処理2の実行 処理3の実行
1 5 ×
2 3 ×

NO.1のケースで処理1・処理3、NO.2 のケースで処理2・処理3が実行される。
上記2ケースのテストで全ての命令文が少なくとも一回実行されるため、カバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) {
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) {
        // 処理2
    }
    
    // 処理3
}

命令網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 yの値 処理1の実行 処理2の実行 処理3の実行
1 15 2

上記1ケースのテストで全ての命令文が少なくとも一回実行されるため、カバレッジが100%となる。


判定条件網羅(Decision Coverage:C1)

分岐網羅 (Branch Coverage)とも呼ばれる。
それぞれの判定条件における真偽が少なくとも1回は実行されるようなテストを実施する。
C1カバレッジ(判定条件網羅)が100%になると、C0カバレッジ(命令網羅)も100%となる。

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

判定条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 判定条件1
1 5 true
2 3 false

NO.1のケースで判定条件1はtrue、NO.2のケースで判定条件1はfalseとなる。
上記の2ケースのテストで全ての判定条件を1度は実行しているので、カバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

判定条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 yの値 判定条件1 判定条件2
1 15 2 true true
2 8 -1 false false

判定条件1について、NO.1のケースではtrue、NO.2のケースではfalseとなる。
判定条件2についても同様で、NO.1のケースではtrue、NO.2のケースではfalseとなる。
よって、上記の2ケースのテストで全ての判定条件を1度は実行しているので、カバレッジが100%となる。


条件網羅(Condition Coverage:C2)

全ての条件式(AND/ORなど複合条件であれば各々の条件式)の真偽が少なくとも一回実行されるようなテストを実施する。
C2カバレッジ(条件網羅)が100%となってもC0カバレッジ(命令網羅)、C1カバレッジ(判定条件網羅)が100%とならないこともある。

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 x % 5 == 0
1 5 true
2 3 false

NO.1のケースでx % 5 == 0true、NO.2のケースでx % 5 == 0falseとなる。
上記の2ケースのテストで全ての条件式の真偽を1度は実行しているので、カバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 yの値 x % 5 == 0 0 < y x % 3 == 0 y % 2 == 0
1 15 -1 true false true false
2 8 2 false true false true

x % 5 == 0x % 3 == 0はNO.1のケースでtrue、NO.2のケースでfalseとなる。
0 < yy % 2 == 0はNO.1のケースでfalse、NO.2のケースでtrueとなる。
上記の2ケースのテストで全ての条件式の真偽を1度は実行しているので、カバレッジが100%となる。

上記のテストケースでは判定条件1がtrueにならないため、処理1は実行されない。
よって、C2カバレッジ(条件網羅)は100%だが、C0カバレッジ(命令網羅)、C1カバレッジ(判定条件網羅)は100%ではない。


判定条件/条件網羅(Condition/Decision Coverage:CC/DC もしくは CDC)

全ての条件式の真偽と、全ての分岐が少なくとも一回実行されるようなテストを実施する。
C1(判定条件網羅)とC2(条件網羅)を組み合わせたもので、C1(判定条件網羅)とC2(条件網羅)のどちらか一方を網羅したとしても、もう一方を網羅できるとは限らないといった難点をカバーしている。

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

判定条件/条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 x % 5 == 0 判定条件1
1 5 true true
2 3 false false

判定条件網羅(C1)
NO.1のケースで判定条件1はtrue、NO.2のケースで判定条件1はfalseとなる。
上記の2ケースのテストで全ての判定条件を1度は実行しているので、カバレッジが100%となる。

条件網羅(C2)
NO.1のケースでx % 5 == 0true、NO.2のケースでx % 5 == 0falseとなる。
上記の2ケースのテストで全ての条件式の真偽を1度は実行しているので、カバレッジが100%となる。

よって、上記の2ケースのテストで全ての条件式の真偽と全ての分岐が少なくとも一回実行されるのでカバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

判定条件/条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 yの値 x % 5 == 0 0 < y 判定条件1 x % 3 == 0 y % 2 == 0 判定条件2
1 10 1 true true true false false false
2 9 -2 false false false true true true

判定条件網羅(C1)
判定条件1について、NO.1のケースではtrue、NO.2のケースではfalseとなる。
判定条件2について、NO.1のケースではfalse、NO.2のケースではtrueとなる。
よって、上記の2ケースのテストで全ての判定条件を1度は実行しているので、カバレッジが100%となる。

条件網羅(C2)
条件式x % 5 == 00 < yはNO.1のケースでtrue、NO.2のケースでfalseとなる。
条件式x % 3 == 0y % 2 == 0はNO.1のケースではfalse、NO.2のケースではtrueとなる。
上記の2ケースのテストで全ての条件式の真偽を1度は実行しているので、カバレッジが100%となる。

よって、上記の2ケースのテストで全ての条件式の真偽と全ての分岐が少なくとも一回実行されるのでカバレッジが100%となる。


改良条件判定網羅(Modified Condition/Decision Coverage:MC/DC)

判定条件/条件網羅(Condition/Decision Coverage:CC/DC もしくは CDC)を利用した場合でも、判定条件網羅(Decision Coverage:C1)と同程度のカバレッジとなるため、より詳細で綿密なカバレッジ網羅を行う必要がある場合に使用する。国際技術標準 DO-178B(RTCA)に準拠している。

以下を満たすようなテストを実施する。

  1. 全ての判定条件の真偽が少なくとも一回実行される(C1)
  2. 全ての条件式の真偽が少なくとも一回実行される(C2)
  3. 全ての条件式が、単独で全体の判定条件の結果に影響する

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

改良条件判定網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 x % 5 == 0 判定条件1
1 5 true true
2 3 false false

上記のテストケースは、C1(判定条件網羅)とC2(条件網羅)を満たしている。
改良条件判定網羅の条件の3についても、条件式はif文の中で1つしか存在していないため、満たしていると言える。
よって、上記の2ケースのテストでカバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

改良条件判定網羅でカバレッジを満たすためのテストケースを考える。
改良条件判定網羅の条件3について各判定条件で検討する。

判定条件1
ANDで結ばれた条件式が2つあり、片方の条件式がfalseとなれば判定条件自体もfalseとなるので「単独で全体の判定条件の結果に影響する」といえる。
よって、判定条件1について以下の3ケースのテストを行う必要がある。

NO x % 5 == 0 0 < y 判定条件1
1 true true true
2 true false false
3 false true false

条件式が両方falseのパターンは、片方の条件式の真偽変更しても判断結果が変わらないため、改良条件判定網羅の条件3を満たさないのでテストケースに含めない。

判定条件2
ORで結ばれた条件式が2つあり、片方の条件式がtrueとなれば判定条件自体もtrueとなるので「単独で全体の判定条件の結果に影響する」といえる。
よって、判定条件2について以下の3ケースのテストを行う必要がある。

NO x % 3 == 0 y % 2 == 0 判定条件2
1 true false true
2 false true true
3 false false false

条件式が両方trueのパターンは、片方の条件式の真偽変更しても判断結果が変わらないため、改良条件判定網羅の条件3を満たさないのでテストケースに含めない。

よって、改良条件判定網羅の条件3を満たすためのテストケースは以下のようになる。

NO xの値 yの値 x % 5 == 0 0 < y 判定条件1 x % 3 == 0 y % 2 == 0 判定条件2
1 10 1 true true true false false false
2 10 -2 true false false false true true
3 9 1 false true false true false true

これらのケースでC1(判定条件網羅)とC2(条件網羅)を満たしており、改良条件判定網羅の条件をすべて満たすのでカバレッジが100%となる。


複合条件網羅(Multiple Condition Coverage:MCC)

すべての条件式の組合せを少なくとも一回実行するようなテストを実施する。条件式の数だけ2のべき乗でテストケースが増える。
単独の判断文に対するカバレッジの中ではもっとも網羅性の高い基準だが、条件式が増えるほどテストケース数が極端に増えていくという欠点もある。

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

複合条件網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 x % 5 == 0
1 5 true
2 3 false

条件式が1つで、その条件式に対してtrue/falseをそれぞれ検証しているのでカバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

複合条件網羅でカバレッジを満たすためのテストケースを考える。
各判定条件でケースを検討する。

判定条件1
ANDで結ばれた条件式が2つあるので、以下の4ケースのテストが必要。

NO x % 5 == 0 0 < y 判定条件1
1 true true true
2 true false false
3 false true false
4 false false false

判定条件2
ORで結ばれた条件式が2つあるので、以下の4ケースのテストが必要。

NO x % 3 == 0 y % 2 == 0 判定条件2
1 true true true
2 true false true
3 false true true
4 false false false

よって、複合条件網羅を満たすためのテストケースは以下のようになる。

NO xの値 yの値 x % 5 == 0 0 < y x % 3 == 0 y % 2 == 0
1 10 2 true true false true
2 10 -1 true false false false
3 9 2 false true true true
4 9 -1 false false true false

以上の4ケースで判定条件1および判定条件2の条件式の組合せを少なくとも一回実行しているのでカバレッジが100%となる。


経路組み合わせ網羅(Path Coverage)

プログラムが実行しうるパスを全てテストで実施する。

例1

public void doSomething(int x) {
    if (x % 5 == 0) { // 判定条件1
        // 処理1
    } else {
        // 処理2
    }
    // 処理3
}

経路組み合わせ網羅でカバレッジを満たすためのテストケースを考える。

NO xの値 x % 5 == 0
1 5 true
2 3 false

プログラムが実行しうるパスを全て検証しているのでカバレッジが100%となる。

例2

public void doSomething(int x, int y) {
    if (x % 5 == 0 && 0 < y) { // 判定条件1
        // 処理1
    } 
    
    if (x % 3 == 0 || y % 2 == 0) { // 判定条件2
        // 処理2
    }
    
    // 処理3
}

経路組み合わせ網羅でカバレッジを満たすためのテストケースを考える。
各判定条件でケースを検討する。

判定条件1
ANDで結ばれた条件式が2つあるので、以下の4ケースのテストが必要。

NO x % 5 == 0 0 < y 判定条件1
1 true true true
2 true false false
3 false true false
4 false false false

判定条件2
ORで結ばれた条件式が2つあるので、以下の4ケースのテストが必要。

NO x % 3 == 0 y % 2 == 0 判定条件2
1 true true true
2 true false true
3 false true true
4 false false false

よって、経路組み合わせ網羅を満たすためのテストケースは以下のようになる。

NO xの値 yの値 x % 5 == 0 0 < y x % 3 == 0 y % 2 == 0
1 15 2 true true true true
2 15 1 true true true false
3 10 2 true true false true
4 10 1 true true false false
5 15 -2 true false true true
6 15 -1 true false true false
7 10 -2 true false false true
8 10 -1 true false false false
9 9 2 false true true true
10 9 1 false true true false
11 8 2 false true false true
12 8 1 false true false false
13 9 -2 false false true true
14 9 -1 false false true false
15 8 -2 false false false true
16 8 -1 false false false false

以上の16ケースでプログラムが実行しうるパスを全て検証しているのでカバレッジが100%となる。