サンプリングと、残存バグ数予測と、TV視聴率:山浦恒央の“くみこみ”な話(52)(2/2 ページ)
プログラマーの永遠の課題「プログラム中の残存バグ数の推定」に迫るシリーズ。第5回では、「サンプリング」による残存バグ数予測について解説する。サンプルとなるテスト項目をどのように選ぶかが“鍵”だ!
3.サンプリングの方法
例えば、ソースコードの総数が100KLOC(10万ステップ)という中規模のプログラムがあり、テスト項目数を1万件作成したとします。この場合、サンプリングとして、テスト項目の母体から「どのように」「何件」選べばいいでしょうか?
(1)サンプリング件数
TVの視聴率調査では、0.004%の標本数で計算しています。仮に、これを残存バグ予測に適用すると、テスト件数の0.004%は0.4件となり、たった1件のテスト項目を実行するだけで残存バグ数を計算できることになります。さすがにこれは非現実的です。
通常、作成したテスト項目の5〜10%をピックアップし、サンプルとして使用している企業やプロジェクトが多いようです。5〜10%という数は、机上デバッグ用にサンプリングするテスト項目数と同じです。
(2)サンプリングの方法
テスト項目の母体から、どのようにサンプルを選べばよいかは非常に悩ましいところです。理想は、1.時間をかけず(従って、安価で)、2.ランダム性があり、3.サンプルを別の目的にも使えることです。
(a)乱数によりサンプリング
TVの視聴率調査では、サンプル数が少ない分、サンプルが偏らないように、例えば、乱数を発生させて標本を選びます。テスト項目でも、乱数を発生させたり、あるいは、10番目ごとにテスト項目を選んだりするなどの方法を適用できます。この「視聴率方式」は、時間がかからず、ランダム性も確保できるのですが、選んだサンプルを別の目的に再利用できないという欠点があります。
(b)机上テストのサンプルを再利用
机上テスト用のテスト項目として、母体のテスト項目から5〜10%をピックアップするのが普通です。これをそのまま、残存バグ数予測のためのサンプルとするのも1つの方法です。時間がかからず、サンプルを机上テストに使える点が素晴らしいですね。
ただし、サンプルは机上テストと兼用するので、机上テストを実施した後に、残存バグ予測のためにサンプルを実行すると、机上テストで摘出したバグは既に修正されているため、サンプリングでテストしても、理論的には(あるいは、正しく開発していれば)バグは“ゼロ”になるはずです。これでは、残存バグ数を推測する意味がありません。
この問題は、机上テスト用に選んだテスト項目を使って、先に残存バグ数を予測し、その後で机上テストを実施するという、通常とは逆の開発プロセスを採用することで解決できます。ただし、机上テスト前の残存バグ数ですので、予測バグ数はかなり多くなります。
(c)回帰テストのサンプルセットを再利用
ソフトウェア開発の終盤、特に「エンドゲーム」と呼ばれるフェーズでは、プログラムは“ほぼ完全に”動作します。この状態でバグを修正する場合、「ほぼ完成」状態を壊したくないため、キチンとした開発プロジェクトでは、必ず、絶対に、何が何でも、「回帰テスト(regression test)」を実施します。
たとえ、たった1行の変更であったとしても、それがどこで、どんな影響を及ぼすか、正確に予測できません。修正箇所とは全く無関係な機能が動かなくなる……、なんてことだってあり得ます。この不可解・不思議な現象を例えるなら、キッチンの水道の水漏れを修理したら、なぜか2階のトイレの電灯が点かなくなった……という感じでしょうか。
表示メッセージを2文字短くしただけなのに、全く無間関係の機能が動かなくなってしまったという場合、恐らく、メッセージが4バイト短くなったことで、ロードモジュールが1ブロック分小さくなり、メモリに別のモジュールがローディングされ、モジュール同士が干渉し合う……といった原因が考えらます(注2)。こんな不思議な現象(専門用語で、機能退行:functional degradation)を摘出するため、エンドゲームでは、変更が完了するたびに、必ず、全機能のサンプルを実行させる必要があります。このためのテストが回帰テストです。
回帰テスト用のテスト項目として、通常のテスト項目の正常ケースから5〜10%を選ぶことが一般的です。また、わずか1文字の変更であっても、必ず回帰テストを実行するので、実行回数が非常に多くなります。そのため、自動実行できる環境を用意しておくことも基本です。
サンプリングによる残存バグ予測では、回帰テスト用に選んだテスト項目を使うのも1つの方法です。回帰テストのテスト項目を使えば、テストが進むにつれて、残存バグ数がどのように減少するかが分かり、品質が良くなっていく過程をモニタリングできます。ただし、回帰テストのテスト項目は、ほとんどが正常ケースなので、予測バグ件数は少なめに出るという問題点があります。
4.おわりに
サンプリングにより、残存バグ数を推定する場合、サンプルとなるテスト項目をどのように選ぶかが重要です。オススメは、「机上テスト用に選んだテスト項目」、あるいは、「回帰テスト用に選んだテスト項目」を再利用することです。これにより、残存バグ数の予測精度は少し下がりますが、時間をかけず、また、別の目的でも使えるため、早く、安くなり、効率も良くなります。
今回で、残存バグ数の推定手法は完結です。これまで5回にわたり、キャプチャー・リキャプチャー・モデル(別名「池の中の魚」モデル)、Gompertz曲線、バグ率、サンプリングを基にしたバグ数予測を取り上げました。活用する際は、1つだけに固執せず、2つ以上の手法を組み合わせて、残存バグ数の信頼度を上げていただければと思います。
残存バグ数が予測できると、プログラムの品質を推測でき、また、開発エンジニアに対して、具体的に「バグの摘出目標数」を設定できます。安く、早く、高精度で品質制御が可能になりますので、実際の開発にぜひ適用してみてください。(次回に続く)
東海大学 大学院 組込み技術研究科 准教授(工学博士)
関連キーワード
デスマーチ | 組み込み開発 | 組み込み開発プロセス改善 | 組み込み開発の混沌から抜け出そう | 現場の声からプロセス改善を深掘りする | 山浦恒央の“くみこみ”な話 | バグ | 開発プロセス | ソフトウェアテスト | システム開発
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- あなたは「バグ」をどう数えていますか? 組み込みソフトウェアの品質管理を考える
あなたの現場では、ソフトウェアの品質管理の考え方をきちんと生かし切れていますか? MONOist編集部では組み込みソフトウェアの品質管理をテーマにしたゼミナール「組み込みソフトウェア開発で問われる品質力」を開催。組織における品質管理の考え方や、実際の開発現場におけるツールの活用・導入に関する事例などが披露された。 - デスマーチ・プロジェクトでの正しい手の抜き方
高機能・多機能化に加え、「品質向上」「コスト削減」「納期短縮」が強く求められる組み込み業界。小手先の対応では太刀打ちできない。 - 連載記事「山浦恒央の“くみこみ”な話」