前回も説明した通り、C1カバレッジの弱点は、各条件文の網羅や優先順位まで考慮できないことです。以下の条件文で考えてみましょう(表1)。
表1は、3つの条件を持った条件文の例です。つまり、「xが0より小さい」または「yが1、かつ、zが2より大きい」値の場合、条件文は「真」となります。この例から、C1を100%網羅するテスト項目は、「条件を満たす」、「条件を満たさない」の2件です。
C2カバレッジでは、条件の組み合わせも考慮します。そのため、表1からC2網羅100%のテスト項目を作成すると、表2の組み合わせとなります。
x<=0 | y==1 | z>2 | x<=0 || (y==1 && z > 2) | |
---|---|---|---|---|
真 | 真 | 真 | 真 | |
真 | 真 | 偽 | 真 | |
真 | 偽 | 真 | 真 | |
真 | 偽 | 偽 | 真 | |
偽 | 真 | 真 | 偽 | |
偽 | 真 | 偽 | 偽 | |
偽 | 偽 | 真 | 偽 | |
偽 | 偽 | 偽 | 偽 | |
表2 テスト項目の組み合わせ |
表2は、C2カバレッジ100%を満たすための組み合わせを表したものです。条件は、(x<=0, y==1, z>2)のように3つに分解して考えます。取りうる結果は、真と偽の2パターンで、おのおのを網羅するテスト項目数は、2の3乗=8件です。この結果から、両者のテスト項目数を比較すると表3となります。
カバレッジの種類 | テスト項目数 | 例 |
---|---|---|
C1 | 条件文の数+1個 | if文の数が3個ある場合、3+1=4個 |
if文内の条件が3個ある場合、1+1=2個 | ||
C2 | 2の条件数乗 | if文内の条件が3個ある場合、2の3乗=8個 |
表3 C1とC2のテスト項目数の比較 |
表3は、C1とC2のテスト項目数の違いを示したものです。C1では、if文内に10個の条件があってもテスト項目は2個ですが、C2の場合、2の10乗=1024個となり、非常に網羅的なテストとなります。その分、テスト項目数は爆発的に増え、C1のテスト項目数は線形で増えるのに比べ、C2は累乗で増加します。C1は、A4用紙を23枚重ねるだけなので、厚みは2mm少しですが、C2は、23回折るので、エベレスト山を越えます。
理論的に、C2を100%網羅することは可能ですが、納期や工数(コスト)の関係上、現実にはエベレストに登るくらい困難です。さらに困ったことは、テスト項目数や工数に比較して、バグがあまり検出できず、効率の悪いテストになることです。このため、筆者は、C2網羅は採用せず、ブラックボックステスト(例えば、同値分割や境界値分析を適用してテストする)を実施する方が圧倒的に効果は高いと考えています。C2網羅は、適用するにしても、「超重要モジュール」や「クリティカルな機能」に絞り、部分的に実施すべきです(*2)。C0、C1、C2は、全プログラムに適用すべきではなく、重要度の応じて、機能別、モジュール別に適用すべきだと考えています。
*2:条件文の組み合わせもある程度テストしたい方は、MCDC(Modified Condition Decision Coverage)カバレッジを適用してはいかがでしょうか? 詳細は割愛しますが、条件文の中身を考慮でき、かつテスト項目数の増加が累乗ではなく線形です。あまり文献が無く、人に伝えにくいのが欠点ですが、ミッションクリティカルな製品(航空・宇宙・車載)系で採用されるケースが増えています。ぜひ、調べてみてください。
Copyright © ITmedia, Inc. All Rights Reserved.