直列システムで考えましょう。*1
クライアントサーバー風のシステムを開発しているとします。
自分はクライアント担当。協力会社がサーバー担当。
大した実装内容ではないので、クライアントの出来は90%程度のつもりです。
10件のテスト項目のうち1件くらいはバグが出るかな、という腹積もりです。
サーバー担当者が言います。
すみません。作業が進まず70%くらいの出来なんですが、とりあえず現状で結合テストしてもらっていいですか?
このふたつを結合してテストしたら、10件のテストのうち何件パスすると期待されるしょうか。
90[%] × 70[%] = 56[%]
ですのでせいぜい5件。つまり半分しかパスしなくても、私は驚きません。
もしテストに1日以上、2,3日かかるのなら、そんな結合テストはやめて、サーバの完成度が上がるまで待った方がマシというものです。
なお、サーバーが90%の出来だとしても、
90[%] × 90[%] = 81[%]
で2件のバグが出ます。
これを
1件+1件=2件
と説明する人が結構いるのには驚かされます。真っ赤なうそなので信用してはいけません。
こんな当たり前のことをわざわざ説明したのにはワケがあります。
どんな単体モジュールも100%の完成度ということはありません。せいぜい予定作業が100%なだけであって、バグは必ずあります。
それを摘出するためのテストなわけです。
実際の完成度が95%程度のモジュールが10個結合されるシステムがあるとして、どの程度バグが出るか、計算してみましょう。
0.95 × 0.95 ・・・→おそよ0.6
システム全体の完成度は0.6です。10件のテストのうち4件は失敗してバグが出てくるということです。
単体で95%というのは、それぞれ10件の単体テストをしても、半分のモジュールではバグが出ない状態です。かならずしも完成度が低い状態ではありません。
しかしそれを10個も結合したら、ボロボロのテスト結果が必至なのです。
最後に、99%の完成度、つまりテスト100件のうち1件以下しかバグが無いモジュールを10個結合してみましょう。
0.99 × 0.99 ・・・→およそ0.9
100件の結合試験のうち10件がNGとなります。
これは単体モジュールの完成度から見れば、相当高い不具合率です。お話にならない品質ですね。
この話をすると二つの反応が出ると思います。
- 単体テストの完成度は99.99%を目標に、テスト項目は1000件くらいにしなきゃ!!
- 単体テストで出たのと同じくらいの件数の不具合が結合でも出るということですね。
前者は労多くして益少ないと思います。私にはデスマーチのラッパに聞こえますね。
以上、いろんな用語に言い換えつつ、誤用しまくりで
イメージ的な
説明を書いてみました。突っ込みどころは満載だと思いますが、ちゃんと知るには長すぎる道のりの道しるべくらいにはなると思います。
どうでしょうか。
コメント