本連載は、JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外(PHPやASP.NET、Ruby on Railsなど)の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です
今回は、「テストの常識」と題し、Webアプリのテスト方法を説明したうえで、実際にJUnitを使用してWebアプリのテストを行ってみましょう。
そもそも、テストとは何のために行うのでしょうか?
ただ何となくテスト項目を作成して実施するのでは、作成したWebアプリの品質が低かったり、開発コストが高くなったりと後々、後悔することになります。まず「テストをなぜ行うのか」「何をポイントにしてテスト作成していくのか」を説明します。
ソフトウェアの品質には、「プログラム品質」「設計品質」の2つがあります。「ユーザーの要求が満たされているかどうか」「機能(ソースコード)の改修や追加が容易に行えるかどうか」の品質を意味します。その品質の向上のために欠かせないのが“テスト”です。
テストの目的は1つでも多くのバグ(プログラムの不具合、または欠陥)を検出し、取り除くことです。仕様書に記載されている機能が満たされていることやプログラムの入力間違いや計算方法の欠陥、フォームの違いなどを確認する作業がテストです。テストによってバグを早期に発見し、後で発見するよりも修正コストを抑えるという利点もあります。
すべてのパターンをテストすることは難しいので、少ないテストケースでより多くのバグを見つけることが理想のテストケースといえます。
どのような種類のテストにおいても、テストを計画し、方法を考え、実施し、結果を評価するという手順を踏みます。このような手順を「テストプロセス」と呼びます。
また、開発プロセスにおいてフェイズごとに実施するテストの種類は異なります。フェイズごとに実施するテストを示したのが表1です。各テストの説明は次項で説明します。テストは、「単体テスト」「結合テスト」「総合テスト」「運用テスト」と順番に実施されます。
開発フェイズ | 開発フェイズの内容 | 対応テストの種類 | |
---|---|---|---|
要求分析 | システムに対する要求内容を分析 | 総合テスト | |
外部設計 | 利用者の立場から見た業務単位の処理内容を定義 | 結合テスト | |
内部設計 | プログラムの詳細を定義 | 単体テスト | |
前項では、テストの目的や手順など基本的な内容を説明しました。テストには、システムの目的とソフトウェアに合わせたいろいろなテスト方法があります。この項では、それぞれのテストの種類や技法について詳しく説明します。
いつ、何をテストするかによって「テストの種類」は異なります。「テストの種類」は、目的を優先して考え、それぞれテストの観点、技法が異なります。各テストの種類の説明は、表2のようになります。
テストの種類 | 説明 | テスト技法 | |
---|---|---|---|
単体テスト | プログラムの個々のモジュール(部品)を対象としたテスト。Javaの場合、クラスやメソッドが単体テスト対象となる | ホワイトボックステスト ブラックボックステスト |
|
結合テスト | 複数のモジュール(部品)を組み合わせたものが連携して動作するかどうかを確認するテスト | トップダウンテスト ボトムアップテスト サンドイッチテスト ビックバーンテスト |
|
総合テスト (システムテスト) |
プログラムの作りは意識せず、システム全体が仕様どおりに機能しているかを確認するテスト | 性能テスト 負荷テスト 例外処理テスト 操作テスト |
|
運用テスト | 顧客が実際の運用において問題なく動作するかどうか確認するテスト | - | |
どのようにしてテストするかによって「テストの技法」は異なります。「テストの技法」は、テストの目的ではなく手段を優先しています。それぞれのテストの種類においてどのようなテスト方法を用いて目的を達成するかで異なります。
特によく用いられるテスト技法について、以下で説明します。
技法 | 説明 | |
---|---|---|
ホワイトボックステスト | プログラムの内部構造に重点を置いたテスト技法。テスト対象となるプログラムの構造や、処理が行われる命令文、条件を判定して命令を制御する判定文などを考慮してテストケースを作成。主として、単体テストで使用される技法だが、結合テスト、総合テストでも適用できる | |
ブラックボックステスト | 外部仕様に重点を置いたテスト技法。プログラムやシステムの仕様を考慮してテストケースを作成。内部構造については、考慮しない。それぞれの種類で対象となる範囲が変わるだけで、結合テスト、総合テスト、運用テストなどさまざまなテストで適用できる | |
技法 | 説明 | |
---|---|---|
トップダウンテスト | 上位のモジュールから下位のモジュールへ順にテストをしていく技法。下位のモジュールのテストが完了してない場合、「スタブ」と呼ばれるテスト用のモジュールが必要となる。上位モジュールのテストが十分に行える | |
ボトムアップテスト | 下位のモジュールから上位のモジュールへ順にテストをしていく技法。上位のモジュールのテストが完了してない場合、代わりに「ドライバ」と呼ばれるテスト用のモジュールが必要となる。下位モジュールのテストが十分に行える | |
サンドイッチテスト | トップダウンテストとボトムアップテストの両方を組み合わせて上位と下位を同時にテストしていく技法。そのため、短期間でテストを完了することが可能となる | |
ビックバーンテスト | モジュールをすべて結合して一度にテストする。システムが大規模だとバグがあった場合、特定するのが困難になる | |
技法 | 説明 | |
---|---|---|
性能テスト | システムの性能が要求通りかテストする。処理時間(スループット)、応答時間(レスポンスタイム)などの性能(パフォーマンス)を測る | |
負荷テスト | システムに高負荷を与え、そのような状況でも正常に動作することを確認。短時間に大量のデータを処理させたり、長時間稼働させたりするなどの負荷を与えてテストする | |
操作テスト | システムに必要となる操作やその手順が容易であることをテスト | |
技法 | 説明 | |
---|---|---|
回帰テスト | バグを修正した際に、ほかの機能に影響ないか修正個所以外の部分もテストする。バグ修正によって予測していないほかの機能への影響を確認 | |
機能テスト | プログラムが仕様書通りに動作するかのテスト。総合テストでは、すべての機能が実現されているか確認 | |
ここまでは、テストの種類や技法について説明してきました。次ページからは、Javaのテストフレームワークの1つである「JUnit」について見ていきます。
Copyright © ITmedia, Inc. All Rights Reserved.