カバレッジの迷宮_C0と終わりの戦略
12分42秒 | テスト品質FE
基本情報技術者試験の頻出テーマを解説した音声コンテンツです。
トランスクリプト(字幕テキスト)
こんにちは、ザ・ディープダイブへようこそ。さて、今回あなたが共有してくれた資料をもとに、 このテーマを深く掘り下げていきたいと思います。はい、よろしくお願いします。 テーマは「ソフトウェアテスト」。でも、いきなり核心の問いかけからなんですけど、 「テストっていったい、いつ終わるの?」っていう。うーん、来ましたね、その問いが。 ええ、「これで大丈夫」って自信を持って言える終わりのサインはどこにあるの?と。 資料にあったこの問い、すごく本質的ですよね。ええ、本当に。で、その問いを考えるうえで、 資料にあった「スタンプラリー」っていう比喩が、実はものすごく的確なんですよ。 スタンプラリー?プログラムをこう、巨大な迷路に見立てて、その中をくまなく歩き回って スタンプを集めていく、みたいな。面白いですね。ただ、このスタンプラリー、 やろうと思えば無限にスタンプを置けてしまう。つまり、明確なゴールがないんです。 ああ、なるほど。だからこそ、最初の問いに戻るんです。いつ終わるのかと。 この終わりなきスタンプラリーをどう攻略するか。ま、それこそが、プロが常に直面している課題なんですよ。 ゴールがないスタンプラリーですか。いや、最初から核心を突いてきますね。 では、その迷路の歩き方、スタンプの集め方の基本から見ていきましょうか。 資料にあった最もシンプルなレベル、「命令網羅 C0」ですね。これはどういう考え方なんでしょう? はい、えっと、これはスタンプラリーの、ま、第一歩ですね。ルールはすごく単純で、 迷路に描かれているすべての通路を、最低1回は通ること。すべての通路を1回は通る。ええ、 プログラムで言えば、ソースコードに書かれている一行一行、すべての命令を、 テストで一度は実行しましょうということです。なるほど、すべてのコードを一度は実行する、と。 正直これさえやれば、テストとしてはもう十分な気がしちゃいますけどね。ですよね。 だって、一度も動かしてないコードはもうないってことじゃないですか。これでいったい 何が見落とされる可能性があるんですか?いい質問ですね。まさにその「これで十分じゃないか」っていう 感覚こそが、最初の、そして最大の落とし穴なんです。落とし穴。ええ。一見、完璧に見えますからね。 でも、ここには重大な死角が存在してる。その死角をあぶり出すのに、 資料の「もし雨なら、傘をさす」っていう例が、もう完璧なんです。「もし雨なら、傘をさす」。 シンプルなプログラムですね。はい。じゃあこのプログラムに対して、テスト担当者が 雨の日だけのシナリオを試したとします。はい。プログラムは雨を認識して、傘をさすを実行します。 これで「もし雨なら」の行も、「傘をさす」の行も、両方実行されました。C0の基準で言えば カバレッジは100%。確かに、100%ですね。スタンプは全部集まったように見えます。 でも考えてみてください。このテストで、晴れの日に何が起こるか分かりますか? あ、いや、分からないですね。テストしてないから。もしかして、晴れの日でも傘をさしちゃうとか? その可能性を否定できない、というのが答えです。うわ、ありえないバグに思えるかもしれないですけど、 「もし、なら」っていう条件分岐の「なら」ではなかったとき、つまり、偽の場合のルートが、 まったくの未踏なんです。なるほど。C0を100%達成しても、迷路の分岐点で 片方の道にしか進んでいない状態が、普通に起こりうる。これがC0の限界です。そういうことですか。 それは盲点でした。実行されたコードの行数だけを満足しちゃうと、その裏にある 通らなかった論理的な道筋を見逃してしまうんですね。まさに。これは危険だ。自分の作った機能が、 思いもよらないところでバグった、なんて話よく聞きますけど、もしかしたら、 原因はこういうことなのかもしれないですね。その可能性は非常に高いと思います。 だからこそ、スタンプラリーには次のレベルが必要になるわけです。次のレベル。ええ、単に通路をなぞるだけじゃなく、 分岐点をきちんと攻略しないと。そこで出てくるのが、次の「判定条件網羅 C1」というわけですね。 その通りです。「分岐網羅」とも呼ばれますね。C1のルールはC0より少し厳しくなります。 ほう。迷路のすべての分岐点で、必ず両方の道、つまりイエスの道とノーの道を通ってください というものです。ああ、なるほど。「もし雨なら、傘をさす」の例で言うと、雨の日のテストに加えて、 晴れの日のテストも必須になる、ということですか?まさに。条件が真になるケースと偽になるケース、 両方をテストして初めてC1達成です。なるほど。雨の日に傘をさすことを確認して、かつ、 晴れの日に傘をささないことも確認する。これでようやくその分岐が正しく機能していると言えるわけです。 でも、ちょっと待ってください。晴れの日のテストって、本当にそんなに重要ですかね? お、いい視点ですね。このプログラムの核心は、雨の日にちゃんと傘をさすことですよね。 晴れの日に傘をささないなんて当たり前で、そこにわざわざコストをかけてテストするのは、 ちょっと無駄な気もしますが。ええ、その視点はすごく重要です。まさにテストの費用対効果、 コストパフォーマンスの話ですね。確かにこのシンプルな例だと、晴れの日に傘をささないのは 自明に思えます。でも、プログラムが複雑になればなるほど、その当たり前が崩れる瞬間があるんです。 ほう。例えば、他の機能を追加したせいで、晴れの日なのになぜか雨フラグが誤って立ってしまう、とか。 ああ、ありそうですね、そういうの。ええ、C1はそういったまさかの副作用から守ってくれる、 最低限のセーフティネットなんです。だから資料にあったように、資格試験なんかだとこのC1が コスパの良い基準としてよく問われるんですね。なるほど。当たり前を疑うためのセーフティネットですか。 そう聞くと、がぜん重要に思えてきました。実務でも、まずはC1を目指すというのは 現実的な目標になりそうです。ええ。多くのプロジェクトでC1は一つの重要なマイルストーンになってます。 ただ、カバレッジの迷路はさらに奥深くて、もっと厄介な分岐点が存在するんです。 資料にもう一つ、さらに厳しいレベルが載っていましたよね。ああ、「複数条件網羅」。ええ。 ありました。これはもう、名前からして複雑そうです。C1とは何が違うんですか? C1がこう、分岐全体の結果が真か偽かを見ていたのに対して、これは分岐の条件式の中身にまで 踏み込むんです。中身、ですか?例えば、会員登録の条件が「20歳以上かつ男性であること」 だったとしましょう。はい。20歳以上と男性、2つの条件が組み合わさってますね。 そうです。この場合、C1を達成するだけなら、例えば、21歳の男性。 これで条件が真になりますよね。ええ。それと、18歳の女性。これで条件が偽になる。 この2パターンをテストすればOKです。はい。でも、複数条件網羅はそれでは満足しない。 本当にすべての組み合わせをチェックしたか?と問いかけてくるんです。すべての組み合わせ? というと、20歳以上かという条件の真と偽。それと、男性かという条件の真と偽。 この2つのサイコロを振って出得る、すべての組み合わせ。ああ、なるほど。つまり、 真・真、真・偽、偽・真、偽・偽。4パターンですね。ええ。25歳男性、30歳女性、 18歳男性、16歳女性。この4パターンすべてをテストしなさいというのが、複数条件網羅の要求です。 なるほど。個々の条件のオン・オフを全部試すと。ということは、これ、 最初のシンプルな分岐とはバグの住処が根本的に違うということですか?まさにその通りです。 そこがポイントなんです。シンプルな条件では起こらない、条件同士の相互作用によって生まれる バグがあるからですね。相互作用。例えば、プログラムの書き方が悪くて、 男性であるという条件をチェックする部分になぜか年齢のチェックが影響を与えてしまう、 みたいなケースです。うわあ。単体の条件だけ見ていたら絶対に見つからない、非常に厄介なバグですよ。 私が以前関わったプロジェクトで、C1カバレッジは100%だったのに、市場で致命的なバグが 出たことがありました。原因はまさにこれで、ある特定の条件の組み合わせだけ計算が狂っていたんです。 それは怖い話ですね。ええ。それ以来、条件式が2つ以上組み合わさっているコードを見ると、 ちょっと身構えるようになっちゃいましたよ。条件が2つで4パターン。もし3つになったら8パターン、 4つで16。で、これ、そうなんです。現実的に全部テストできるんですか? あっという間に組み合わせが爆発しますよね。そうなんですよ。全部やるのは無理だっていうその感覚、 それこそが冒頭でお話しした「カバレッジのジレンマ」の正体です。ジレンマ。網羅率を高めれば 品質への信頼は上がりますが、資料にあった通り、必要なテストの数は雪だるま式に増えていく。 ああ、カバレッジ率を90%から95%に上げるコストと、95%から99.9%に上げるコストは、 もう比べものにならないほど後者のほうが大きい。なるほど。まるでクリア後のRPGで レベル98から99に上げるのに、それまでの全経験値が必要になる、みたいな感じです。 それは的確な例えですね。完璧を目指せば目指すほど、ゴールが指数関数的に遠ざかっていく。 でも、品質は妥協したくない。まさにジレンマだ。そうなんです。だから現実のプロジェクトでは、 全部やるは答えにならない。限られた予算と納期のなかで、完璧な100%を追い求めるのは、 ほとんどの場合ビジネス的に不可能です。ふむ。ここで求められるのが、技術的な正しさとはまた別の、 戦略的な判断力なんです。ということは、テストというのはただひたすらコードをチェックする作業 というよりは、もっと計画的で、戦略的なものなんですね。その通りです。 優れたプロジェクトマネージャーはここで腕を見せます。ほう。まず、作っているシステムの リスクを評価するんです。これは人命に関わる医療機器のソフトなのか、それとも社内ツールなのか。 バグが一つ出たときの影響はどれくらいか、とか。はいはい。それを冷静に分析したうえで、 予算と納期と品質のバランスをとる。「よし、今回は心臓部である決済機能だけは、 複数条件網羅レベルで徹底的にやろう。でも、それ以外の画面はC1カバレッジ85%を目標にしよう」 といったように。なるほど。スタンプラリーの地図を広げて、どのエリアに重点的にスタンプを置くか、 どのスタンプは今回はあきらめるかっていう計画を立てるわけですね。ええ、まさに。 これをももう単なる作業者じゃなくて、司令官の視点ですね。この知識は試験対策としてだけでなく、 実務でこそ価値が問われるスキルだということが、ひしひしと伝わってきます。いやあ、面白いです。 さて、今回はソフトウェアテストの「カバレッジ」という概念を、「ゴールのないスタンプラリー」という 比喩を手がかりに、あなたと一緒に深く掘り下げてきました。ええ。すべての通路を通る命令網羅C0から始まって、 すべての分岐を両側から確認する判定条件網羅C1。はい。そして条件の組み合わせという迷路の深部を探る 複数条件網羅と、それを追いかけることの現実的な困難さ、カバレッジのジレンマまで見てきました。 ここで一番大事なのは、テストにおける「完璧」という言葉は、絶対的な基準ではないということなんです。 ふむ。それはプロジェクトの目的、リスク、予算、納期といった、まあいろんな制約のなかで、 常に戦略的に定義されるものなんです。はい。だからこそ、「どこまでテストすればいいですか?」 という問いの唯一の正解は、「それはあなたのプロジェクト次第です」ということになる。なるほど。 あなたが向き合っているシステムの品質を考えるうえで、この視点こそが鍵になりますね。では、最後に、 この探求を踏まえて、あなたに一つ、思考をさらに深めてもらうための問いを投げかけたいと思います。 はい。今回の資料はテストの量、つまりどれだけ網羅するか、に焦点を当てていました。ええ。 でも、ジレンマの話で見たように、現実にはすべてをテストすることができない。ならば、次に考えるべきは テストの「質」ではないでしょうか?質、ですか。つまり、無限に置けるスタンプを迷路のどこに 優先的に配置すべきか。最もバグが潜んでいそうで、最も致命的な結果を招きかねない危険な通路や、 複雑な分岐点。あなたなら、それをいったいどうやって特定しますか?
このコンテンツは Web society で視聴・学習できます。