ソフトウェアのバグはゼロになることはありません。ある程度減ってきたら良しとするしかないのです。
ソフトウェアのテストの自動化、テストプログラムの自動生成などで新しい技術は出てきています。しかし、そのような技術は全てソフトウェアです。従って、その結果を無条件で信頼することはできません。なぜなら自動化技術そのものにもバグがあるからです。
ソフトウェア開発といっても、種類は非常に多いです。ソフトウェアスタックの下から考えれば、ファームウェア、デバイスドライバなどのハード系、OS、コンパイラなどの基本ソフト、多くの人が使う商用アプリケーション、注文されて作る顧客アプリは造りが全く違います。また、組み込みソフトはまた違います。開発手法やテスト手法の点ではOSSもまた違います。
テストの種類とテストプログラムの作成/収集とテスト結果の管理は別物ですので、それぞれ説明します。
テストの種類は単体テスト、モジュールテスト、部品テスト、統合テストなどですが、それぞれの呼び方は、ソフト開発の種類によってさまざまです。また、ソフトのバージョンアップの場合にはリグレッションテストが必須です。
テストプログラム(TP)を誰が設計し、どうやって作成したり収集したりするかはかなり変化してきました。
昔は、ソフトウェア開発部門がTPを作成していましたが、その後開発部門が作成した仕様書を元にテスト部門がTPを作成する手法が導入されました。また、出荷したソフトが利用者先で発生した障害を起こすプログラムを収集することも始まりました。かなり前から、仕様書に基づいてTPを自動生成するTPジェネレータも使われています。
注文アプリの場合には、顧客用件と契約内容に応じてテスト仕様書を作成してテストします。
テスト結果の評価と管理は今でも難しい問題です。
テストの結果NGが出た場合、それがテスト対象プログラムの障害なのか、それともテストプログラムに間違いがあるためなのかが問題になることが起きるからです。長い間使われてきたTP(枯れたTP)の場合はこの問題は起きにくいです。
以下の三種類の障害(バグ)は原因を突き止めたり対策をたてるのが非常に難しいですし、自動化もあまり役に立ちません。こういうのに遭遇したときは、経験のある人間に頼るしかないです。
- 再現性が低い障害:数ヶ月に一度起こるが,同じ条件で実行しても再現しない
- デバッガが使えない障害:障害が起こるが、デバッガ配下では問題なく動作する
- バグを修正したことによる障害:アプリには間違いがあるが、OS等の障害のおかげで思うように動作していた。OS等の障害を修正した結果動作しなくなった。