テストとは何か
テストとは、機能の品質が保障されていることを証明するために行う検査である。機能の大きさに応じて、単体テスト、結合テスト、システムテスト(総合テスト)に大きく分類される。それぞれのテストに応じて、機能に潜在しているバグを発見し、修正することが主な作業である。バグの発見に対しては良くないイメージを抱いてしまうが、バグを取り除くことが最大の目的であり、品質確保には絶対に欠かせない。
- 単体テスト(UnitTest、UT)
- 結合テスト(IntegrationTest、IT)
- システムテスト(SystemTest、ST)
単体テスト(Unit Test)
単体テストでは、モジュールを一つずつ検査する。詳細設計書を元に単体テスト仕様書を作成する。テスターは、単体テスト仕様書に基づいたテストを実施し、バグがあれば実装者にモジュールを修正してもらう。
インプット | アウトプット |
|
|
現在では様々なテストツールが用意され、代表的なものではJUnitがあげられる。これは、単体テストの自動化を目的としたxUnitの一つであり、Javaプログラムのメソッド単位でテストプログラムを実装し、視覚的にテスト結果を得られるという特徴がある。また、単体テストにはホワイトボックステストとブラックボックステストがある。
ホワイトボックステスト | モジュールの内部構造に着目してテストする。命令、条件を全て網羅し、モジュールで想定される全てのパターンをテストする。 |
ブラックボックステスト | モジュールの内部構造には着目せず、モジュールが想定するインプットデータに着目してテストする。インプットデータを同じ意味のあるグループに分け、グループの中の一つのデータを使用する同値分割、インプットデータを真(有効)と偽(無効)に分け、真偽の境目に着目する限界値分析がある。 |
どちらのテストも着眼点が異なり、意義も異なるため、どちらが良いということはない。基本的には、ブラックボックステストで行うテストであれば、モジュールが果たす機能を全て確認できるはずである。JUnitなどもブラックボックステストの一つである。しかし、テスターが詳細設計書を元に作成した単体テスト仕様書には、テストパターンに洩れがある可能性はある。インプットデータに着目したテストでは、インプットとなるパターンを全て網羅していないこと、テスト環境によって動作が異なる場合があること等がリスクとなり得る。したがって、ホワイトボックステストによって全ての動作を検査することが重要である。ホワイトボックステストでは、モジュールが想定するインプットでは起こりえないと考えられるパターンまでテストすることができる。逆に言えば、モジュールが想定するインプットでは起こりえないことを保障できれば、ブラックボックステストのみで十分である。
システムテスト(System Test)
システムテストでは、結合テストまでで完成したシステムに対してテストを行う。総合テストとも言う。顧客の動作環境でテストすることもあり、要件定義レベルのシステム要件がきちんと満たされているかを確認する。
インプット | アウトプット |
|
|
結合テストをクリアしていれば、おおよそ設計バグのような障害は発生しないが、実際に運用する環境(本番環境)で行うため、システム的な障害や、性能問題が発生することがある。特に、性能問題を解決するためには、単体レベルまでモジュールを再テストする必要があり、原因の切り分けと処理の効率を踏まえた上で、プログラム仕様を再設計する。それらにかかるコスト(時間)が、スケジュールを非常に圧迫する要因である。システムテストに至る前までに、単体テスト、結合テストのレベルで性能テストを行う必要がある。それでも性能に関するリスクを全て取り除くことは不可能であり、システムテストで発生する障害への対応を踏まえたスケジューリングが重要である。
受け入れテスト
受け入れテストは、システム開発を発注した顧客企業側で行うテストである。要求した機能や性能を満たしているかをテストする。開発側で行ったシステムテストと同等のレベルでテストが行われるが、システムテストに顧客が立ち会ったりする場合も多く、システムテストを受け入れテストと見なすこともある。
リリース(カットオーバー)
受け入れテストをクリアすると、晴れて顧客企業へリリースとなる。とはいえ、出来立てのシステムをフル稼働させることは危険であるため、実験的に、段階的に稼動させていく場合が多い。