テストで「バグが収束している」と簡単に判断してはいけない理由

ソフトウェアのテストでは、x軸を日付、y軸を累積バグ数にしてバグ収束曲線のグラフを作成し、グラフが収束傾向を示しているかによって、ソフトウェアの品質が十分良好なレベルに達しているかを判断したりしてます。著者のブログ「 ソフトウェアのバグ摘出モデルとバグの収束性、テストの網羅性について 」で記述しているように、ランダムにテストを実行する場合は累積バグ数は収束曲線を描きますが、テストケースを順に実行する場合は累積バグ数と実行パスの累積数(累積テストケース数に相当)は直線的な比例関係であるため、一般に累積バグ数のグラフは収束傾向を示しません。そのためテストでは累積バグ数が収束傾向を示すグラフになっても直ちに「バグが収束している」と判断してはいけません。この点について少し詳しく説明します。

目次

1.はじめに

ソフトウェア開発におけるテストでは、テスト計画を立案し、実施する多くのテストケースを作成した後、実際にテストを開始します。通常はこのテストケースを記載順に実行していきます。 このテストの実行方法は以下のページに記載したように逐次実行モデルのようになります。

k-harmohealing.hatenablog.com

逐次実行モデルでは、累積バグ数の平均$\bar{x}$は、実行パスの総数$N_{p}$、バグの総数$a$、実行パスの実行回数$n$とした時、 \[ \bar{x} = \frac{a}{N_{p}}n \qquad \ldots \text{(1)} \] になります。テストではテストケースを順に実行するため、実行パスの実行回数$n$は実施したテストケースの累積数(累積テストケース数)になります。従ってこの式から、累積バグ数の平均は累積テストケース数に比例することがわかります。 (逐次実行モデルでは、「1つの実行パスには1つのバグしか含まれない」という仮定を設定しているため、実際のテストとは差異が生じますが、概ね直線の傾向になると考えられます。)
一方、テストでバグ収束曲線(ソフトウェア信頼度成長モデルなど)1)2)を作成する場合、x軸を日付(時間)、y軸を累積バグ数にしたグラフがよく作成されています。図1にバグ収束曲線の例を示します。このバグ収束曲線がテストの終盤までに収束する(曲線の接線の傾きがほぼ水平になる)と残存バグがほぼゼロになっていると判断しています。

図1 バグ収束曲線の例

図1 バグ収束曲線の例
バグ収束曲線は様々な形状があり、図1に示すようなS字型の指数曲線になることがあります。 累積バグ数と累積テストケース数は前述のように直線の傾向があるとすると、なぜ図1のような指数曲線のようなグラフになるか疑問ですが、この理由について以下で考えてみます。

 

2.累積テストケース数のグラフの形状と累積バグ数

累積バグ数と累積テストケース数が図2のようなグラフであったとします。図2は実際のデータではないですが、概ねこのような直線的なグラフになることがあります。

図2 累積バグ数と累積テストケース数

図2 累積バグ数と累積テストケース数

一般にテストで実施されたテストケース数は日々異なります。例えば、テスト開始当初はバグによってテストがあまり進まないということがあります。バグの修正にも当初は時間がかかる場合があります。また、複数のサブシステムやサブ機能と結合テストを実施する場合、それらの開発状況によってテスト開始が遅れる場合があります。このような理由によってテストの開始当初は毎日のテストケース数は少ないことがあり、テストが順調に進むようになって、ほぼ一定のテストケース数を毎日実行できるようになる場合があります。
テストの終盤では、機能間の連携テストや業務シナリオに基づいた機能の確認など時間がかかるテストを実施する場合があるため1日のテストケース数が少なくなります。また、テストケースが多いサブシステムは他のサブシステムよりもテスト期間が長くなる場合があり、そのため1日のテストケース数が少なくなります。
このようにソフトウェアの品質状況やどのようなテストをいつ実施するかなどによって日々のテストケース数は変化します。
図3に日々のテストケース数とその累積数をグラフにした例を示します。図3は表1の日ごとのテストケース数合計と累積テストケース数の列を使ってグラフにしています。図3のテストケース数合計の列は、サブ1〜サブ3の合計になっており、サブごとにテストの開始時期が異なっています。
図2は、表1の累積バグ数の列を使ってグラフにしたものです。この表1の累積バグ数を日ごとにグラフにした結果を図4に示します。累積バグ数と累積テストケース数が図2のように直線的な傾向を示していても、毎日のテストの進み具合によって、日ごとの累積バグ数は図4のような形状になります。
表1は実際のデータの傾向を参考にして作成したもので実績値ではないのですが、毎日のテストで実行されたテストケース数によってグラフの形状はかなり影響されることがわかります。

図3 テスト消化項目数と経過日数

図3 テスト消化項目数と経過日数

表1 テストにおける日々のテストケース数とバグ数

表1 テストにおける日々のテストケース数とバグ数

図4 累積バグ数と経過日数

図4 累積バグ数と経過日数

3.まとめ

以上記述したように累積バグ数と累積テストケース数が直線的な関係であっても、日ごとの累積バグ数をグラフ化するとS字型のような指数曲線になる場合があります。このことから累積バグ数のグラフを評価する時は、日々実行されたテストケース数の状況や、テストの実行方法(逐次かランダムか)、ソフトウェアの品質状況などを考慮して評価する必要があることがわかります。また、 「 ソフトウェアのバグ摘出モデルとバグの収束性、テストの網羅性について 」で記述しているように、 テストケースを逐次的に実行する場合は累積バグ数と累積テストケース数は直線的な関係にあり、さらに 稼働後の残存バグ数は網羅率と関係があるため、 ソフトウェアの品質を判断する際には、累積バグ数のグラフの収束傾向のみではなく、 テストの網羅性などの観点で品質を分析して判断する必要があります。

参考文献

1) 独立行政法人 情報処理推進機構 ソフトウェア・エンジニアリング・センター:“定量的品質予測のススメ”, P149, 2008/10/1
2) 山田茂, 大寺浩志著:“ソフトウェアの信頼性 ~理論と実践的応用~”, ソフト・リサーチ・センター, (1990)



本ブログの記載内容に関する免責事項

  • 本ブログの内容の利用により生じた損害に対して、いかなる理由であっても著者は一切の責任を負いませんので予めご了承ください。
  • 本ブログの内容は、予告なく変更・削除する場合がありますのでご了承ください。