今回はソフトウェア開発プロジェクトにおいてプロダクトの品質を担保するソフトウェアテストの方法論について書いていきたいと思います。
ソフトウェアテストの工程
テスト工程を構成する下位工程
ソフトウェア開発プロジェクトのテスト工程は一般的に以下のような下位工程から構成されます。
1.単体テスト
2.結合テスト
3.システムテスト
4.検査
5.受け入れテスト
1~3は、開発者が実施するテスト、4は開発部門とは別の品質保証部門が実施するテスト、5は顧客サイドで行うテストとなります。
単体テストは「ユニットテスト」とか、「モジュールテスト」などと呼ばれることもあり、プログラムのモジュール(部品。クラスや関数など)が仕様通りに作成されていることを検査することを目的とします。
単体テストでエラーが検出された場合、原因究明の範囲が狭いため、エラーの解消は比較的容易です。
しかし単体テストが不十分なまま次工程に進んでしまうとエラーの検出や解消にかかる工数が膨れ上がってしまうため、単体テスト工程は開発生産性の観点から非常に重要と言えます。
2の結合テストは関連する複数のモジュールを結合して実行し、モジュールを呼び出す側と呼び出される側のインタフェースが一致していることの確認を目的とします。
単体テストがモジュールの内部仕様の検証を主たる目的とするのに対し、結合テストはモジュールの外部仕様(外部インタフェース)の検証を主たる目的とします。
3のシステムテストはプログラム全体が最終的にシステムの機能要求と非機能要求(性能、セキュリティ等)を満たしているかどうかを確認することを目的とします。
しかし単体テストからシステムテストまではプログラムの内部構造に精通した開発者がテストを実施するため、詳細なテストを実行できる反面、偏りや見落としが発生しやすいという傾向があります。
そこで、この欠点を補うために、品質保証部門等が第三者的立場で実施するのが4の「検査」です。
検査はユーザーにプログラムを引き渡す前の最終テストとなるため、網羅的なテストや異常なケースのテストを徹底的に実施します。
5の「受け入れテスト」は、ソフトウェアの納品時に発注者(ユーザー)自身によって行われるテストで、ソフトウェアが要求仕様通りに作成されていることの確認を目的とします。
不特定多数のユーザーが利用するパッケージソフトや、クラウドサービスの場合、品質保証部門が「検査」と「受け入れテスト」の両方を実施することになります。
各テスト工程のまとめ
上記をまとめると以下のようになります。
テスト工程 |
目的 |
実施者 |
単体テスト |
モジュールの内部仕様の検証 |
開発者 |
結合テスト |
モジュールの外部インタフェースの検証 |
開発者 |
システムテスト |
プログラム全体がシステムの機能要求と非機能要求を満たしているかの検証 |
開発者 |
検査 |
開発者によるテストの偏りや見落としを補う |
品質保証部門 |
受け入れテスト |
ソフトウェアが要求仕様通りに作られているかどうかを確認 |
ユーザー |
テストデータの作成技法
プログラムの品質を高めるためには誤りを検出し得る「効果的なテストデータ」の作成が不可欠です。
「効果的なテストデータ」を作成する技法として、「機能テスト法」と「構造テスト法」があります。
「機能テスト」はプログラムの機能仕様からテストケースを抽出するものです。
プログラムのソースコードを見ないため、「ブラックボックステスト」とも言われています。
「機能テスト」の方法として「同値分割法」、「原因結果グラフ法」があります。
同値分割法
同値クラス表の作成
同値分割法では、まず同値クラス表を作成します。
同値クラス表は、機能仕様で定義された入力条件、出力条件、無効な入力条件を表に記入していくことで作成します。
以下にパスワード入力チェックモジュールをテストする際の同値クラス表の例を示します。
入力条件 |
有効同値クラス |
無効同値クラス |
文字数 |
8~20 |
0~7,21以上 |
文字の種類 |
英数字記号の組み合わせ |
英字のみ、数字のみ、英数字のみ、英字と記号のみ、数字と記号のみ |
有効同値クラスのテストデータ選定
次にこの同値クラス表を用いて有効同値クラスのテストデータを選定します。
有効同値クラスのテストケースは、テストの効率を高めるため、一つのテストデータで複数のテストケースを含めるように工夫します。
パスワード入力チェックモジュールのテストを例に取ると、まず最初にテストデータとして入力値「abcd123_」を用意します。
「abcd123_」は最低文字数条件(8字)を満たし、文字種類は英字、数字が2字以上で記号が1字のみ存在するデータです。
加えて最大文字数(20字)で文字種類は英字、記号が2字以上で、数字が1字のみ存在するデータ「9bbbccc@xyzwwww_-ABC」及び、有効な任意の文字数(8~20以内)で文字種類が数字、記号が2字以上で英字を1文字だけ含むデータ「0123B[]:@/9876」を用意します。
これら有効同値クラスのテストデータをまとめると以下のようになります。
No. |
データが満たすべき条件 |
データ例 |
1 | 8文字かつ英字、数字2字以上、記号1字を含むデータ | abcd123_ |
2 | 20文字かつ英字、記号2字以上、数字1字を含むデータ | 9bbbccc@xyzwwww_-ABC |
3 | 有効な任意の文字数(8~20字)かつ、数字、記号2字以上、英字1字を含むデータ | 0123B\[]:@/9876 |
これらを用意することで有効同値クラスの以下の5個のテストケースを網羅することができます。
・最低文字数テスト
・最大文字数テスト
・英字が含まれているかどうかのテスト
・数字が含まれているかどうかのテスト
・記号が含まれているかどうかのテスト
無効同値クラスのテストデータ選定
次に無効同値クラスのテストケースですが、個々のテストケースに対応するテストデータを作成しテスト漏れが発生しないようにします。
つまり無効同値クラスの場合はテストケース1個に対してテストデータ1個が対応します。
これは一つのテストデータで複数のテストケースに対応する有効同値クラスと異なる点です。
パスワード入力チェックモジュールのテストの場合、無効同値クラスのテストデータとして以下を用意する必要があります。
No. |
データが満たすべき条件 |
データ例 |
4 | 0文字のデータ | 入力無し |
5 | 文字数が7文字以下のデータ | def-573 |
6 | 文字数が21文字以上データ | Xb^9821-p203@kwlw000: |
7 | 英字が含まれない(数字と記号のみ)データ | 1593@84510_ |
8 | 8.数字が含まれない(英字と記号のみ)データ | HIjknv_yr@ |
9 | 9.記号が含まれない(英数字のみ)データ。 | 8Bamboo563 |
同値分割法のまとめ
以上の様に有効同値クラスと無効同値クラスの合計で9個のテストデータを用意することでパスワード入力チェックモジュールの入力条件、無効な入力条件に関するテストケースを網羅することができます。
テストデータの位置関係を以下に示します。
|
0~7字 |
8~20字 |
21字以上 |
英字のみ |
|
|
|
数字のみ |
|
|
|
英数字のみ |
|
9 |
|
英数字記号 |
5 |
1,2,3 |
6 |
英字記号のみ |
|
8 |
|
数字記号のみ |
|
7 |
|
記号のみ |
|
|
|
未入力 |
4 |
|
|
番号1,2,3のテストデータ(ブルーの部分)のみが成功し、他の番号のテストデータがすべてエラーとなればモジュールが正常に動作していることになります。
長くなりましたので続きは次回以降、解説します。