はじめに
先日、テスト指標について話題に上がりました。
テスト密度、バグ検出率など色々ありますが、まずはカバレッジについて纏めていきます。
カバレッジ(網羅率)
カバレッジとはテストが実施された割合です。
C0:命令網羅(ステートメント・カバレッジ)
全ての命令文が実行されるようにテストする。
命令文が呼ばれないケースは含まない。
if (x && y) { // (1)
if (z) { // (2)
GetData(); // (A)
}
}
のような場合、処理(A)が呼ばれるケースのみ実施すればよい。
つまり
No. | x | y | z | 備考 |
---|---|---|---|---|
1 | true | true | true | 分岐(1)に入る ⇒ 分岐(2)に入る ⇒ 処理(A)が実行される |
のケースを実施すれば、命令網羅したことになります。
C1:分岐網羅(ブランチ・カバレッジ)
全ての分岐を通るようにテストする。
分岐がTrue、Falseの場合の網羅なので、分岐条件の網羅はしない
例えば
if (x && y) { // (1)
if (z) { // (2)
GetData(); // (A)
}
}
のような場合、分岐(1)(2)に入る/入らないを網羅すればよい
つまり
No. | x | y | z | 備考 |
---|---|---|---|---|
1 | true | true | true | 分岐(1)に入る ⇒ 分岐(2)に入る |
2 | true | true | false | 分岐(1)に入る ⇒ 分岐(2)に入らない |
3 | false | true | true | 分岐(1)に入らない |
のケースを実施すれば、分岐網羅したことになります。
C2:条件網羅(コンディション・カバレッジ)
個々の条件式の真偽を、それぞれ含むようにテストする。
それぞれを網羅するが、複合条件の網羅はしない
例えば
if (x && y) { // (1)
if (z) { // (2)
GetData(); // (A)
}
}
のような場合、x、y、zのtrue/falseをそれぞれ網羅すればよい
つまり
No. | x | y | z | 備考 |
---|---|---|---|---|
1 | true | true | true | |
2 | true | true | false | No.1、No.2でzのtrue/falseを網羅 |
3 | true | false | true | No.1、No.3でyのtrue/falseを網羅 |
4 | false | true | true | No.1、No.4でxのtrue/falseを網羅 |
のケースを実施すれば、条件網羅したことになります。
MCC:複合条件網羅(マルチコンディション・カバレッジ)
個々の条件式の真偽を、全ての組み合わせでテストする。
条件をすべて網羅する
if (x && y) { // (1)
if (z) { // (2)
GetData(); // (A)
}
}
のような場合、x、y、zのtrue/false全パターンを網羅すればよい
全パターンを書き出すと
No. | x | y | z | 備考 |
---|---|---|---|---|
1 | true | true | true | |
2 | true | true | false | |
3 | true | false | true | |
4 | true | false | false | |
5 | false | true | true | |
6 | false | true | false | |
7 | false | false | true | |
8 | false | false | false |
のケースとなります。
3~8は分岐(1)に入らない為、分岐(2)の判定は行われません。
つまり
No. | x | y | z | 備考 |
---|---|---|---|---|
1 | true | true | true | |
2 | true | true | false | |
3 | true | false | true | |
4 | false | true | true | |
5 | false | false | true |
を実施すれば、複合条件網羅したことになります。
その他
他にも「行カバレッジ」や「関数カバレッジ」と言うものなどがありますが、指標にしにくいので割愛します。
- 行カバレッジ
テストで実行した行の割合(テスト密度に似ているが少し違う) - 関数カバレッジ
テストで実行した関数の割合