ソフトウェアテスト
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ソフトウェアテスト(software test)とは、コンピュータのプログラムを実行し、正しく動作するかどうか確認する作業のことである。ソフトウェアテストは、プログラム中の欠陥(バグ)をできる限り多く発見することを目標として行われる。ソフトウェアテストに成功するとは、欠陥を発見することである。ソフトウェアテストでは、欠陥が存在することを示すことはできるが、欠陥が存在しないことは証明できない。
目次 |
[編集] ホワイトボックステストとブラックボックステスト
プログラムの構造に注目したテストをホワイトボックステスト(white box test)、プログラムの入力と出力に注目したテストをブラックボックステスト(black box test)という。
[編集] ホワイトボックステスト
ホワイトボックステストとは、プログラムの構造に着目したソフトウェアテストのことである。着目する構造には命令や分岐などがあり、注目した構造に対してどれだけの割合の部分を実行できたかを網羅率で表す。
1: int abs(int x){ 2: if(x<0){ 3: x=-x; 4: } 5: return x; 6: }
[編集] 命令網羅
命令網羅基準を用いてテストを行う場合は、すべての命令を実行すればよい。上記のabs関数では、x = -1
を用いてテストすれば命令網羅基準に従ってテストできたことになる。
[編集] 分岐網羅
分岐網羅基準を用いてテストを行う場合は、すべての分岐において、すべての分岐の方向を実行すればよい。上記のabs関数では、x=1とx=-1を用いてそれぞれテストすれば、分岐網羅基準にしたがってテストできたことになる。
[編集] ブラックボックステスト
ブラックボックステストでは、プログラムの入出力だけに注目し仕様通りにプログラムが動作するかをテストする。プログラムの入力が単一の値である場合は同値分割や限界値分析を、プログラムの入力が複数あり相互に影響を与えるような場合はディシジョンテーブルや原因結果グラフなどを用いて入力を決定する。
[編集] 同値分割
入力を、有効なデータの範囲と無効なデータの範囲に分け、それぞれの代表的な値を用いてテストを行う。
[編集] 限界値分析(境界値分析)
入力を、有効なデータの範囲と無効なデータの範囲に分け、その境界となる値を用いてテストを行う。プログラムのエラーは分岐の境界で発生する場合が多いため、限界値分析に基づいたテストを行うことで、同値分割に基づいたテストよりも多くの欠陥を発見することができる。
[編集] 同値分割と限界値分析の適用例
例えば、次のようなプログラムがあったとする。
- 入力: 時刻 (0:00-23:59)
- 出力: 10:00≦入力≦20:00であれば通常料金、それ以外であれば割増料金
同値分割ではそれぞれの範囲から代表的な値を入力として選びテストを行う。
- 入力例) 8:00、12:00
限界値分析では、入力の範囲を想定される出力ごとに分割し、それぞれの範囲の境界を入力として選びテストを行う。
- 入力例)9:59、10:00、20:00、20:01
[編集] ディシジョンテーブル
ディシジョンテーブルとは、入力が複数のパラメータから構成されている場合に、 入力と出力の関係を表形式で表したものである。 表の各列がテストケースを表している。
テストケース | 1 | 2 | 3 | 4 | |
入力 | 平日である | ○ | ○ | × | × |
午前10時から午後8時 | ○ | × | ○ | × | |
出力 | 通常料金 | ○ | |||
割増料金 | ○ | ○ | ○ |
[編集] 原因結果グラフ(因果グラフ)
[編集] 単体テストと結合テスト
全体が完成してからテストをすることをビッグバンテストという。規模の小さなプログラムであれば、この手法でうまくいく場合もあるが、この手法は大規模なプログラムに対して適当でない。なぜなら、大規模なプログラムを一気にテストをして問題が発生したときに、問題の原因を巨大なプログラム中から探すのが困難だからである。また、ソフトウェア中に複数のバグが存在する場合、それらのバグが相互に影響しあい、バグの原因の特定がさらに困難になる場合もある。そのため、ソフトウェアテストでは、最初に単体テストによってモジュール単位のテストを行う。単体テストで問題で十分にモジュール単位のテストが終わった時点で、結合テストに進む。
[編集] 単体テスト(Unit Testing)
単体テスト、あるいはユニットテストとは、メソッドなどの小さな単位で行うテストのことである。単体テストは、ホワイトボックステストを利用して行われる場合が多い。「Unit Testing」の略である「UT」と呼ばれることが多い。また、開発現場によっては「CT(和製:Coding Test)」や「PT(和製:Program Test)」と略されることもある。
単体テストのツールとしてテスティングフレームワークJUnitが有名である。これはJava専用だが、他の言語にも対応したものもあり、それはxUnitと呼ばれている。
[編集] 結合テスト(Integration Testing)
結合テストとは、単体テストでテストが完了したプログラムを組み合わせて行うテストである。プログラムのどの部分から組み合わせていくかで、トップダウンテスト(top down test)とボトムアップテスト(bottom up test)に分けることができる。「Integration Testing」の略である「IT」と呼ばれることが多い。
[編集] トップダウンテスト
結合テストにおける手法の一つ。単体テストが完了したモジュールのうち、上位モジュールから順に結合させてテストを行なう。この手法の利点は、仕様的な振る舞いを決定する上位モジュールを早期に検証することによって、機能漏れ、仕様の認識違いなどの致命的な不具合を、開発の早い段階で発見できることにある。一方で、数の多い下位モジュールの検証が先送りされるため、開発と平行してテストを進めにくいという欠点もある。
[編集] ボトムアップテスト
結合テストにおける手法の一つ。トップダウンテストとは逆に、単体テストが完了した下位モジュールから順に結合させてテストを行なう。この手法の利点は、数が多く独立性の高い下位モジュールから順に検証することで、開発とテストを平行して実施できることにある。一方で、システムの根幹となる上位モジュールで不具合が発見された場合、テストが完了したはずの下位モジュールも影響を受けるという欠点も持っている。
[編集] テストドライバとテストスタブ
単体テストや結合テストを行う際に、テスト対象のプログラムを呼び出すためのプログラムや、テスト対象のプログラムが利用しているプログラムがまだ使えない(もしくは、テストが完了していないため使うべきでない)場合がある。このような場合に、テスト対象のプログラムを呼び出すためのプログラムをテストドライバ(test driver)、テスト対象のプログラムが利用しているプログラムの代替となるプログラムをテストスタブ(test stub)という。
int isOddNumber(int x){ return !isEvenNumber(x); }
上記のプログラムは、与えられた値が奇数かどうかを判定するプログラムである。このプログラムをテストするために必要なテストドライバとテストスタブの例を示す。
[編集] テストドライバ
int main(){ int num=1; if(isOddNumber(num)){ printf("%d is a odd number",num); }else{ printf("%d is not a odd number",num); } }
[編集] テストスタブ
int isEvenNumber(int num){ return num%2==0; }
[編集] 統計的手法
冒頭で述べたように、ソフトウェアテストでは、欠陥が存在することを示すことはできるが、欠陥が存在しないことは証明できない。そこで、いつソフトウェアテストを終了すればよいかを決定するための基準として信頼度成長曲線等が利用される場合がある。
[編集] システムテスト
プログラムを単独ではなく、他のプログラムやハードウェア、通信ネットワーク、データベースなどと組み合わせて実施するテスト。機能を検証することから機能テストと呼ばれることもある。エンタープライズ系のソフトウェアの場合、実際の顧客環境を使って行うこともある。組み込みソフトウェアの場合、実際のハードウェアにソフトウェアを組み込んだ状態で行うテストを指す。
[編集] 受け入れテスト、検収テスト、承認テスト
受け入れテスト(検収テスト、承認テストとも呼ばれる)とは、システムの実際の利用者が行うテストで、システムが要求通りの機能や性能を備えているかどうか確認する。
[編集] アルファテスト、ベータテスト
完成前のソフトウェアを一般のユーザに利用してもらい、欠陥を発見してもらうテストのこと。ベータテストで配布されるソフトウェアは、基本的には製品版と同等の機能を備えるが、予期せぬ不具合が存在する可能性があるため、利用に際しては細心の注意を払わなければならない。アルファテストは、ベータテストよりも完成度の低い段階で行うテストである。オンラインゲームにおいては、ベータテストを広く一般に公開し、宣伝の目的も兼ねて実施される場合が多い。
[編集] ストレステスト
ストレステストとは、ソフトウェアシステムに対して高い負荷を与え、データの破壊など致命的な問題が発生しないかをテストすること。ストレステストを行うことで、高い負荷が加わっている状況でしか発生しない不具合や、発生確率の低い欠陥を発見することができる。
[編集] パフォーマンステスト
パフォーマンステストとは、ソフトウェアシステムの性能を測り、既定の性能が出ることを確かめること。通常、プログラム単体では問題が発生しなくても、通信、データベース、I/O、高負荷、長時間使用などの条件化では性能が低下することがあるため、これを確認するために実施する。OSやミドルウェアなどでは性能を測定するための共通の計測モデルが決まっていることもある。
[編集] 回帰テスト(リグレッションテスト)
プログラムを修正・変更した場合に、修正前の他の機能が動作することを確認するために行うテストを回帰テスト(リグレッションテスト)という。過去のテスト資産が使え、実施する回数も多いことからテスト自動化の対象とされることが多い。
[編集] 関連項目
[編集] 関連ツール
カテゴリ: 書きかけの節のある項目 | ソフトウェア工学 | スキル | コンピュータ関連のスタブ項目