「未満」と「以下」の誤認識する場合を考えましょう。「未成年とは20歳未満のこと」であれば、例題の記述は正ですが、開発したプログラマが、「20歳未満」を「20歳以下」と勘違いをした場合はどうでしょうか(*3)。
*3:この「境界条件のエラー」は、古今東西のプログラムのバグの永遠不滅の王者です。
if (in <= 20) { printf("未成年です\n"); }
in=9、in=30では、「未成年です」と表示されるか、何も表示されないかどちらかです。これでは、プログラマが最もミスを犯しやすい「境界ケース」を網羅できず、間違いに気付けないことがあります(*4)。
*4:仕様の未記載や仕様の誤解から、バグが発覚して、数日(時には数週間、数カ月)を無駄にするケースを何度も見てきました。例えば、仕様記述者と実装側エンジニアが「未成年」の解釈が違うなどです。この場合、両者の責任の擦り付け合いに発展することが多く、プログラムの仕様の誤解以上に、両者の感情的な問題に発展する問題が少なくありません。大抵、仕様記述者の立場が強く(組織の地位的にも上位にあることがほとんど)、実装側の責任にされてしまうようです。筆者の経験上、本当の責任は、曖昧な仕様を記述した側にあると思っています。敗けるな、プログラマ!
そもそも、仕様が間違っているケースはどうでしょう。本例では、未成年を暗黙的に20歳未満としていますが、実は18歳未満だったらどうでしょう。その場合も、上記同様、バグを検出できません(*5)。
*5:テスト項目にも間違いがあることも忘れてはなりません。ソフトウェアのテスト項目が間違っている確率は20%といわれています。高校の中間テストや期末テスト、はては入試問題でも、途中で先生が入室して、「問題文の訂正があります。問5の(3)に『鎌倉時代の』とありますが、『平安時代の』に変更してください」とアナウンスしたりします。多数の先生がチェックしているテスト問題でもこれだけの誤りがあるのです。ましてや、1人で設計して作成するソフトウェアのテスト項目には、かなりの数のエラーがあります。
上記から、制御パステストを実施したからOKとする前に、仕様に着目したテスト(境界値分析、同値分割など)がキチンとできているか分析しましょう。
開発技法には、利点もあれば欠点も存在します。筆者の個人的な考えでは、「C2カバレッジは、欠点の大きさに比べて利点が小さく、労力の割に効果が出ないテスト」です。読者の皆さまは、今回紹介したC2カバレッジの欠点を理解しつつ、制御パステストを実施していただければと思います。知っていてやることと知らずにやることとは大きな違いがあるでしょう。
次回は、「C2カバレッジ100%」をクリアーする場合に鬼門となる「ループ」「割り込み」「デットコード」の3つに触れます。
[1]「ソフトウェアテスト実践ガイド」(大西建児著、2004年、日経BP)
[2]「知識ゼロから学ぶソフトウェアテスト 改訂版」(高橋寿一著、2013年、翔泳社)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.