以下のプログラムを例に考えましょう(表.2)。
if ( x <= 0 || (y == 1 && z > 2)) { //命令文? }
表.2は論理演算子のORとANDが結合しているif文の例です。C1カバレッジ100%を満たすには、以下がポイントとなります。
真:xを0以下にする
偽:xを1以上
条件が複数あっても、論理演算子がORなので、他がどうであれxが真と偽になればOKです。よって、これだけ網羅するとC1カバレッジ100%となりますが、以下のケースを考慮していません。
(1)各条件文の中身が取りうるパターンを考慮していない
(2)条件文の優先順位を考慮していない
判定だけを見ると、テスト項目は2個で済みますが、各条件のパターンを網羅していません。全パターンを作成すると、2のn乗個だけ必要です。表.2で考えると、条件は3個ありますので、2**3 = 8件となります。
8件全ての組み合わせを網羅するには、C2カバレッジを実施する必要がありますが、時間とコストが必要となります。「完全に網羅するよりも、エンジニアリング的な観点に立って、低コストと時間短縮を選択する」か、「網羅されていない箇所を何らかの簡単な方法で補う」か、「あくまでC2カバレッジ100%網羅を実施する」かは、ソフトウェア開発者のみならず、全てのエンジニアに共通する永遠の課題です。
処理方式の長所と短所をきちんと認識し、自分の「エンジニアとしての信念」、あるいは「エンジニアリングの宗教」にもとづいて、決断を下してください。「無知だったので手を抜いた」と「エンジニアリング的に手を抜いた」では、結果的に同じであっても、エンジニアの資質やレベルが全く異なります。キチンと工学的に正しく手を抜いてください。
C1カバレッジでは、各条件文の優先順位を考慮しないため注意が必要です。この欠点は、コンパイラやプログラミング言語の処理方式と関係しており、条件文の評価の方法や演算子の優先順位は、コンパイラにより異なります。表.2の例で考えると、1つ目の条件文(x <= 0)の結果が偽の場合、2つ目の条件(y == 1, z > 2)以降を評価しないこともあるようです。更に、条件演算子(&&や||)の評価順序は、C1カバレッジ100%だけではテスト漏れとなる可能性があります。
以上から、C1カバレッジは現実的なテスト量で実施可能ですが、「コンパイラが複数の条件文をどのように評価するか」までは考慮できないことが分かります。コンパイラの処理方式まで意識してテストするには、上記で述べたように時間とコストが必要になります(*5)。ここでも、エンジニアのセンスと信念が試されます。
今回はC1カバレッジの利点と弱点、特に弱点について紹介しました。各カバレッジのメリット・デメリットを理解し、残りのスケジュールに合わせたテストが行えると効果的なテストが期待できます。そこには、エンジニアとしての決断と信念とセンスが必要です。なお、C0とC1について消化不足の方はGcovなどを用いて手を動かしてみてください。
次回は、みなさんが敬遠するC2カバレッジについて紹介します。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.