書評「ソフトウェアテスト技法」

書評「ソフトウェアテスト技法」

ボーリス バイザー (著), 小野間 彰 (翻訳), 山浦 恒央 (翻訳) , 日経BP社

カテゴリ:テスト

概要

プログラムの内部構造に注目して行うテスト=ホワイトボックステストの考え方を理論的に解説した技術書。中級から上級の開発者、テスト担当者でソフトウェアテストを理論的に学習したい人に勧める。とりわけ、単体テストを自動化する際には、本書の内容の理解は重要となる。同著者によるブラックボックステストを解説した『実践的プログラムテスト入門』と対をなす一冊であり、ソフトウェアテストの理論に関する古典と言える。

本書の使い方

第1章:「テストとは何か」についてのまとめを知ることができる。
第2章:バグの分類の考え方を知ることができる。
第3章~第12章:ホワイトボックステストでつかわれる技法を解説する。本書の技術的な中心をなす。読者はまず順を追って学習し、次いで、必要に応じて興味のある個所を再読することを勧める。
第13章:各種のテスト技法を実際に適用する際のポイントをまとめる。
付録:バグの種類を詳細に分類している。バグを分類、分析する際には有益な枠組みを提示してくれる。

基礎的なプログラミングに関する知識と、実務経験を前提としているので、入門~初級者は、他の入門書籍を学習し、一通りの実務経験を経た上で、読むことを勧める。

何を学べるか

第1章 はじめに
テストとは何かを、多角的に分析する。テストの目的、テストとデバッグの違い、機能テストと構造テストの違い、様々なテストのモデルの紹介、完全なテストは可能かの考察、など幅広い範囲からテストを考える。

第2章 バグの分類
バグの「重要度」について、その考え方と導き方を説明する。次にバグの分類法を解説する。本書ではバグを下記の9つの大項目に分類する。 ①要求仕様の不良②概念仕様不良と機能不良③構造不良④データ不良⑤コーディング不良⑥統合不良⑦システム、ソフトウェアアーキテクチャの不良⑧テストの設計と実行不良⑨その他、の9つである。 本書のバグの分類法は、広く引用される、著名な分類法の一つである。

第3章 フローグラフとパステスト法
ユニット(単体)テストの基礎であるパステスト法について解説する。パステスト法は構造モデルとしてプログラムの制御フローを使用して行うテスト法である。プログラムは円と矢印からなる図(グラフ)、すなわち制御フローとして記述することが可能である。フローチャートと制御フローグラフの違い、プログラムの制御フローからテスト項目を生成する方法、パス選択の基準、特定のパスを実行するための入力データを決定する方法などについて述べる。 パステスト法はすべてのテスト技法の基本であり、例えば第4章、第6章の内容は、本章のパスの概念の理解が必要となる。

第4章 トランザクションフローテスト法
システムの処理動作や機能の構造を記述する方法である、トランザクションフローを解説する。前章の制御フローに適用した方法は、機能テストでも使用できる。すなわち、システムの動作はトランザクションフロー、すなわち円と矢印からなるグラフで記述することが可能であり、そのグラフをくまなく網羅してテストする。制御フローやパステスト法はプログラマのための手法であり、トランザクションフローテスト法は、システムテスト担当者のための手法と言える。

第5章 データフローテスト
データフローテストは制御フローグラフを使って、データに発生する不正(データフロー変則)を検出するテスト法である。データが使用される前に初期値化されているか、あるいは定義済みのデータがちゃんと使用されているか、などを確認するためには、どのパスを選択してテストすればよいか。こうしたパス選択作業の総称を本書ではデータフローテストと呼ぶ。データフロー変則を検出する考え方は、テストパスの選択に応用でき、完全パステストとブランチカバレッジ・テスト/ステートメントカバレッジ・テストのギャップを埋めるのに使えると著者は説く。本章では、様々なデータフローテストの方法を比較し、一般化やツール、効果について述べる。

第6章 ドメインテスト
プログラムは、入力をグループ(ドメイン=領域)に分類し、そのグループに対応して、それぞれ適切な処理を行うと考えることができる。ドメインテストは分類分けが正しいか、分類された入力データが正しく処理されるかどうかをテストする。 本章では、プログラムのインターフェースやモジュール統合におけるドメインテストの適用方法、ドメイン(領域)の設計方法、テスト可能性を考慮したソフトウェアの設計、ドメインテストの限界などについて解説する。

第7章 メトリックスと複雑性
ソフトウェアの複雑性を計測するメトリックス(指標)について説明する。 語句的メトリックス(プログラム行数、ステイメント数など)、Halsteadのメトリックス、トークン数のカウントによるメトリックス、McCabeのメトリックス(サイクロマチック数)、ハイブリッドメトリックスをとりあげ、その応用と実現方法を解説する。

第8章 パス、パス積、正規表現
本章では、フローグラフを応用して使用することができるために必要な知識を解説する。これらの知識はテストツールを開発する上でも必須である。 グラフにおけるパスの集合を、代数的に表現するために「パス式」の考え方を導入する。また変則規則、および、重みづけにより、パス式を正規表現に変換する方法を学ぶ。これらの知識により、グラフやフローグラフの構造的特性を分析し、パスの総数、処理時間、データフローの変則が発生するかどうかなどのチェックに適用することができる。また、テスト設計やデバッグで発生する問題へ、正規表現を応用する方法についても解説する。

第9章 構文テスト
不正な入力により、システムがダウンすることを防止するためには、システムの入力データの正当性をチェックしなければならない。本章では、データの構文テストの考え方と進め方について解説する。内部や外部からの入力データを、入力データの正当性テストに最適な形式に機械的に変換できる表記法である「BNF」を使って表現し、データの構文をテストする方法について説明する。

第10章 論理テスト
本章ではデシジョンテーブルを用いて論理をテストする方法を解説する。多くのプログラムの機能仕様はデシジョンテーブルで定義できる。またデシジョンテーブルは、プログラムやテストの設計にきわめて有効である。一方、論理を簡単な形式で扱うことができるブール代数を用いることによって、デシジョンテーブルの一貫性や完全性を検証することができる。後半ではブール代数のテスト設計への応用や、カルノー-ベイチ図を用いて、ブール代数を容易に扱う方法などを説明する。

第11章 状態、状態のグラフ表現、遷移テスト
状態グラフ(図)と状態テーブル(表)は、有限状態マシンの記述に使用されるツールであり、プログラムの動作を記述するのに役に立つ。また機能テストのためのツールとしても、テストが容易なプログラムを作るための設計用ツールとしても有効である。本章では有限状態マシンモデルを用いて、ソフトウェアの構造、動作、仕様をテストする方法について解説する。また状態グラフを用いて、パステストに類似したテストの手法も解説する。

第12章 グラフ行列と応用
ソフトウェアをグラフ(図)で表現することによって、そのグラフのパスをトレース(数え上げ)し、トレースしたパスを網羅するようテスト項目を抽出し、テストを実行することが可能となる。しかし、グラフに書かれたパスを人間がトレースすることはミスを生じやすい。それを解決する方法として、本章ではグラフをグラフ行列として表現することにより、機械的にパスのトレースと同じ操作を行うことができる方法を紹介する。またこれをベースにしたツールを検討する。行列の操作、関係、ノード削減アルゴリズム、等価クラス分割などについても説明する。

第13章 実現方法
本章では、本書で紹介した様々なテスト技法を適用する方法について解説する。開発工程におけるテストの種類、誰がどのテストをするのか、プログラマとテスト担当者との関係、プログラマのテスト戦略、テスト担当者のための基礎データとテスト戦略、製品としてのテスト、テストツール、テスト実行の自動化、テスト設計の自動化などについて述べる。

付録 バグの統計と分類
第2章で紹介した、バグの分類項目を掲載する。9つの大項目を、さらに中項目、小項目にブレークダウンした、詳細な分類項目を紹介する。また、各項目ごとに分類されたバグの統計データも紹介する。