Q 質問 ユーザーに提供する前に十分なテストを行っておきたいが,どうすればすべてのバグをつぶすことができるのでしょうか。

A 回答 完ぺきに近いテスト計画を作るのは難しく,仮にできたとしてもテストを実施するには時間がいくらあっても足りません。限られた時間で効率よくバグをつぶすことが,現実的な方法になります。そのためには,バグが出現しやすい状況でテストすることが重要です。


表1●見つけにくいバグや内在しやすい問題
表2●テスト支援ツール
 見つけにくいバグは,メモリー周りの処理やエラー処理,組み合わせ処理,リカバリ処理などに隠れていることがよくあります(表1[拡大表示])。これらは,仕様書通りに動くことを確認するだけのテストでは,なかなか見つけられません。バグの症状が出現しやすい状況を作らなければ,見つけにくいものです。

 具体的には,(1)負荷をかける,(2)連続運転を行う,(3)わざとエラーを発生させる,(4)想定外の使い方をする,(5)同時に複数の機能を組み合わせて使う,(6)疑似的に機器を故障させる――などのテストをすることが大事になります。テストを支援するツールが市販されており(表2[拡大表示]),負荷をかけるテストなどでは,ツールの活用がポイントの一つです。

ツールの過信は禁物

 メモリーに十分な空き領域がある状況では,不正なメモリー・アクセスによるバグの症状は現れにくくなります。メモリー・リークが起きている場合も,メモリーの空き領域が十分あれば何も問題は起こしません。しかし,システムがカットオーバーして負荷が上がるとメモリーの空き領域が少なくなり,メモリーに関するバグが姿を現します。ただしメモリー関連のバグの症状は,再現性がない場合が多いため,見つけるのがやっかいです。

 このようなバグをカットオーバー前につぶすには,高負荷環境でのテストを実施したり,連続運転を行ったり,自動エラー検出ツールを使ったりして,机上では見つけにくいバグを検出します。高負荷環境を作るための負荷テスト・ツールを使えば,数台のマシンで数十から数百台に相当する負荷をかけることができます。高負荷環境でも,プログラムの挙動は変わらず正常であるかを確認します。また,連続運転を行っても空きメモリー量が異常に減っていかないかを確認します。

 自動エラー検出ツールを使えば,低負荷環境でもメモリー関連のバグの個所を検出することができます。自動エラー検出ツールには2種類あり,ソース・コードを分析して静的にエラー個所を検出するタイプと,プログラムの実行中に動的にエラーが起きていないかどうかを検出するタイプがあります。前者はすべてのソース・コードを検査対象にできますが,完全なチェックはできません。後者はメモリー・エラーをほぼ完全にチェックできますが,すべてのソース・コードがチェックできるわけではなく,実行したソース・コードしかチェックできません。

 エラーに対する処理は,すべてのエラーを含めたテスト・パターンの把握が難しいため,往々にしてテストされていないコードが残り,そこにバグがあるとカットオーバー後に発覚してしまいます。このようなバグを事前に見つけるには,市販の未テスト検出ツールが役に立ちます。未テスト検出ツールは,テストを実施した後で,まだテストしていないソース・コードを検出します。テスト漏れの可能性を少なくすることができます。ただし,ソース・コードを基に検査するツールであるため,上流工程の設計漏れなどは見つけることができません。

 複数処理が組み合わさった時に起きる問題やリカバリ処理時に起きる問題は,実際にやってみないと分かりません。本番を想定して同時に稼働する処理は並行稼働し,それぞれが正常に動作することを確認します。リカバリ処理をテストするには,マシンを疑似的に壊す方法が手っ取り早いでしょう。クラスタリング構成を採用している場合は,正常に処理が引き継がれるか,また,データベースの整合性がきちんと確保できるか,といったことを確認します。 

(本誌)