ソフトウェアテストは、
コンピュータプログラムの欠陥(
バグ)を発見し、仕様を満たしているか検証する作業です。テストで発見された欠陥を修正する作業は
デバッグと呼ばれます。
ソフトウェアテストの成功は、欠陥の発見、試験項目への合格、または品質目標の達成によって定義されます。
ソフトウェアテストは、単に
バグを見つけるだけでなく、以下の様な多岐にわたる目的を持っています。
欠陥の防止: 要件定義、設計、コーディングなどの各段階で成果物を評価し、欠陥の作り込みを防ぎます。
要件の検証: 明確化された要件を
ソフトウェアが満たしているかを確認します。
完成度の確認: ソフトウェアが完成しているか、ユーザーや関係者の期待に応える動作をするかを確認します。
品質の保証:
ソフトウェアの品質に対する信頼を積み重ね、所定のレベルに達していることを確証します。
リスクの低減: 故障や欠陥を発見し、不十分なソフトウェア品質によるリスクを減らします。
意思決定の支援:
ソフトウェアの品質レベルに関する情報を提供し、意思決定をサポートします。
コンプライアンス: 契約、法律、規制上の要件や標準を遵守しているか検証します。
変更への信頼:
ソフトウェアの変更(リファクタリング、機能追加)によって発生する可能性のある
バグ(リグレッション)を検出し、品質に対する信頼性を高めます。
ソフトウェアテストは、変更への信頼を生み出すことで、
ソフトウェアの品質と提供速度を向上させる効果があります。リグレッションテストは、コード変更による
バグを発見し、欠陥の作り込みを防止し、品質に対する信頼性を高めます。これにより、エンジニアは自信を持って変更を行えるようになり、結果として
ソフトウェアの品質と提供速度が向上します。
動的テストと静的テスト
ソフトウェアテストは、大きく動的テストと静的テストに分けられます。
動的テスト: プログラムを実際に動かして行うテストです。
静的テスト: プログラムを動かさずに、
ソースコードやオブジェクトコードを検証するテストです。静的テストには、コードレビュー、ウォークスルー、インスペクションなどがあります。
コンパイラやプリ
コンパイラも静的テストの一種です。
機能試験と性能試験
ISO/IEC 9126の枠組みを利用して、機能試験と性能試験を分類することができます。
機能試験: ソフトウェアが規定された機能を果たすかを検証するテストです。例えば、関数に特定の引数を与えたときに、期待した戻り値が返されるかを確認するテストなどが該当します。
性能試験:
ソフトウェアシステムの性能を測定し、必要な性能が出ているかを確認するテストです。例えば、同時アクセス数、処理速度、応答時間などを測定します。過負荷に対する性能をテストするものはストレステストと呼ばれます。
検証試験と妥当性確認試験
ソフトウェアテストは、検証試験と妥当性確認試験という視点でも分類できます。
検証試験: 仕様通りに動作するかを、試験仕様に基づいて確認するテストです。適合試験も検証試験の一種です。
妥当性確認試験: エンドユーザーの意図通りに動作するかを確認するテストです。
テストの実施順序
ソフトウェアテストは、一般的に
モジュール単位のテストから始まり、結合テスト、システムテスト、受入テストへと進んでいきます。
トップダウンテストとボトムアップテスト
結合テストでは、トップダウンテストとボトムアップテストのどちらかを選択します。
トップダウンテスト: 上位モジュールから順に結合してテストを行います。仕様的な振る舞いを決定する上位モジュールを早期に検証できるという利点があります。
ボトムアップテスト: 下位
モジュールから順に結合してテストを行います。開発と並行してテストを進めやすいという利点があります。
ソフトウェアテストは、テスト対象のプログラムの内部構造に着目するか、
入出力に着目するかによって、ホワイトボックステストと
ブラックボックステストに分けられます。
ホワイトボックステスト: プログラムの内部構造に着目したテストです。命令網羅、分岐網羅、条件網羅など、様々な網羅基準があります。
ブラックボックステスト: プログラムの
入出力に着目したテストです。同値分割、限界値分析、決定表、原因結果グラフなどの手法が用いられます。
同値分割: 入力を同じように扱えるグループに分割し、各グループから代表的な値を選んでテストを行います。
限界値分析:
入出力の境界となる値を用いてテストを行います。
決定表: 複数の入力条件とそれに対応する動作を、表形式で表現したものです。
原因結果グラフ: 入力条件と出力の関係をグラフで表現したものです。
単体試験と統合試験
ソフトウェアテストは、テスト対象の単位によって、単体試験と統合試験に分類できます。
単体試験: 関数やメソッドなどの小さな単位で行うテストです。xUnitなどのテスティングフレームワークが用いられます。
統合試験: 単体試験が終わったプログラムを組み合わせて行うテストです。トップダウンテストやボトムアップテストなどがあります。
システムテストと受入試験
ソフトウェアテストは、システム全体を対象とするシステムテストと、ユーザーがシステムを受け入れるかどうかを判断する受入試験があります。
システムテスト: プログラムを他のプログラムやハードウェアなどと組み合わせて行うテストです。
受入試験: システムの利用者が行うテストです。
アルファテストとベータテスト
ソフトウェア開発の最終段階で、ユーザーに
ソフトウェアを試してもらうテストとして、アルファテストとベータテストがあります。
アルファテスト: 開発チーム内部で行うテストです。
ベータテスト: 外部のユーザーに行ってもらうテストです。
テスト代替 (Test Doubles)
テスト対象のプログラムを呼び出すためのプログラムや、テスト対象のプログラムが利用しているプログラムがまだ使えない場合、テストドライバやテストスタブなどのテスト代替を利用します。
テストドライバ: テスト対象のプログラムを呼び出すためのプログラムです。
テストスタブ: テスト対象のプログラムが利用しているプログラムの代替となるプログラムです。
回帰試験
プログラムを修正・変更した場合に、過去に行ったテストを再度行うことを回帰試験といいます。
再現試験
初めて起きた現象や実験結果を確認するためのテストを再現試験といいます。
統計的手法
ソフトウェアが複雑になると、性能試験や機能試験の結果を統計的に処理し、テストの効率化を図ることがあります。
アジャイルテストの4象限
アジャイルテストでは、テストを「ビジネス面/技術面 x チーム支援/製品の批評」の4つの象限に分類し、各テストの役割を明確に認識します。
まとめ
ソフトウェアテストは、
ソフトウェアの品質を保証するための重要なプロセスであり、開発ライフサイクル全体を通して行われます。この記事で紹介した様々なテスト手法を適切に使い分けることで、より高品質な
ソフトウェアを開発することができます。