テストを実施するに当たっては,各モジュールを結合してコンポーネントに集積していく方法やテストケースの設定方法,テストの網羅性の基準といったテスト方法を事前に決定しておかなければならない。品質とコストのバランスを取りながら最も効率的なテスト方法を決定するべきだ。

布川 薫/日本IBM

 前回は,テスト・フェーズを効率良く実施するための「テスト計画」を取り上げた。今回はテストを実施する方法について,プロジェクトマネジメントの観点から説明しよう。

テストのカバー範囲

 具体的なテスト方法の説明に入る前に,システムの構造とテストの役割について整理しておく。

 情報システムは一般に,図1のような階層構造を持つ。

図1●情報システムの構造
図1●情報システムの構造

 階層の最上位は「システム」で,大規模システムの場合はこれが複数の「サブシステム」に分割される。サブシステム(小規模なときはシステム)は,複数の「コンポーネント」で構成される。

 大規模システムでは,コンポーネントがさらに「サブコンポーネント」に分割される場合もある。コンポーネントやサブコンポーネントは,複数の「モジュール」から構成され,モジュールはさらに小さな「内部モジュール」(サブルーチン)を持つこともある。

 システム開発におけるテストは,このシステム構造の最も下位に当たるモジュールからテストを始め,コンポーネント,システムと順に実施していく(図2)。まず「単体テスト(UT:Unit Testing)」で,モジュールの論理(ロジック)そのものとモジュール間インタフェースの欠陥除去を行う。これらは,モジュールを結合しながらコンポーネントに集積していく過程で同時に検証していく。

図2●テストのカバー範囲
図2●テストのカバー範囲
[画像のクリックで拡大表示]

 次に「統合テスト(IT:Integration Testing)a」で,モジュールを集積した結果であるコンポーネントとコンポーネント間インタフェースについて,内部仕様と外部仕様にかかわる欠陥を除去する。ちなみに日本IBMでは,単体テストと統合テストaを「開発実施フェーズ」の中で行っている(第3回の図2を参照)。開発作業とテストを同時並行的に実施することで作業効率を高められるからだ。

 大規模システムの開発では,統合テストaの次に「統合テストb」を実施する。これは,各コンポーネントを統合した結果であるサブシステムとサブシステム間インタフェースについて,外部仕様にかかわる欠陥を除去するのが目的だ。統合テストaとbが完了したら,「システム・テスト(ST:System Testing)」でシステム全体の欠陥を除去する。

単体テストの方法を決める

 最初に単体テストの方法について説明しよう。

 単体テストは,基本的にはモジュールを開発したプログラマが実施する。このため,テストを実施する担当者の人数は非常に多くなる。もしプロジェクトや開発チームで事前に単体テストの方法を決めておかなければ,各担当者が勝手な方法で実施してしまう。これではテストの効率や品質が悪くなる。

 単体テストの方法で最初に決めなくてはならないのは,各モジュールを結合して1つのコンポーネントに集積していく方法である。この決定は,きわめて重要になる。テストケースの設定やテストツールの選択,モジュールのコーディングの順序,テストの品質やコストに大きな影響を及ぼすからだ。

 モジュールの集積方法には,「インクリメンタル方式(増加式)」と「ノンインクリメンタル方式(非増加式)」がある。

 インクリメンタル方式とは,モジュールを計画した順番どおりに作成・テストし,徐々に結合していく方法である。結合するたびにモジュール間インタフェースのテストを実施する。このテスト方法のことを「インクリメンタル・テスト(増加テスト)」と呼ぶ。

 一方,ノンインクリメンタル方式は,それぞれのモジュールを作成・テストしておき,最後に一挙に結合する方法だ。モジュール間インタフェースのテストは最後に結合したときに実施する。このテスト方法は「ノンインクリメンタル・テスト(非増加テスト)」と呼ぶ。

 インクリメンタル方式とノンインクリメンタル方式のどちらを選ぶべきかはモジュールの作成方法にもよるので一概には言えない。ただし,一般にはノンインクリメンタル方式はなるべく使わない方がよい。最もエラーが発生しやすいモジュール間インタフェースの確認を最後の段階で行うことになるからである。この段階でエラーを発見しても,原因の特定は困難なことが多い。