テストって、とにかくいろいろ動かしてみればいいんですよね?
やみくもに試すと、時間がかかるのに大事なミスを見逃すんだ。だから「どこを、どう試すか」の考え方がいくつもある。大きく分けると、中身を見ないテストと中身を見るテストの2つだよ。
テストの段階をおさらい
システム開発では、小さな単位から順に大きな単位へとテストを進めます(工程全体は「システム開発の流れ」の単元で扱っています)。
| 段階 | 確かめる範囲 |
|---|---|
| 単体テスト | プログラムの部品(モジュール)1つ |
| 結合テスト | 部品を組み合わせたときの受渡し |
| システムテスト | システム全体(性能・セキュリティなども含む) |
| 受入れテスト | 発注者が要件を満たしているか確認 |
この各段階で使われるのが、これから学ぶ ブラックボックステスト と ホワイトボックステスト です。
中身を見るか、見ないか
自動販売機で考えてみましょう。
- ブラックボックス:お客さんの立場で「150円入れてボタンを押したら、ジュースとおつりが正しく出るか」を確かめる。中の機械は見ない
- ホワイトボックス:修理担当の立場でふたを開け、「100円玉が来たらこの通路、10円玉ならこの通路」と、内部の通り道を一つずつ確かめる
| ブラックボックステスト | ホワイトボックステスト | |
|---|---|---|
| 見るもの | 仕様(入力と出力) | プログラムの内部構造(ロジック) |
| 中身の知識 | 不要 | 必要 |
| 代表的な技法 | 同値分割、限界値分析 | 命令網羅、分岐網羅 |
| 主な用途 | 単体〜受入れテストまで幅広く | 主に単体テスト |
ブラックボックステストの技法
映画館の料金を例にします。年齢を入力すると料金区分を表示するプログラムです。
- 0〜12歳:子ども料金
- 13〜64歳:大人料金
- 65歳以上:シニア料金
- マイナスの年齢:エラー
すべての年齢を試すのは大変です。そこで、テストする値を賢く選びます。
同値分割
入力値を「同じ結果になるグループ(同値クラス)」に分け、各グループから代表値を1つずつ選んでテストします。上の例なら −5、6、30、70 の4つです。同じグループの値は同じように処理されるはず、という考え方です。
限界値分析(境界値分析)
プログラムのミスはグループの境目で起きやすいものです。「13歳以上」を「13歳より大きい」と書き間違える、といったミスですね。そこで、境目の両側の値(−1と0、12と13、64と65)を重点的にテストします。
限界値分析では、有効な端の値だけでなく、すぐ外側の無効な値もテストするのがポイント。「1〜100が有効」なら、1と100だけでなく 0と101 も選びます。
ホワイトボックステストの技法
ホワイトボックステストでは、プログラムの中の命令や分岐をどこまでもれなく通したか(網羅したか)を基準にテストケースを作ります。
| 技法 | 基準 |
|---|---|
| 命令網羅 | すべての命令を少なくとも1回は実行する |
| 分岐網羅(判定条件網羅) | すべての分岐について、条件が真の場合と偽の場合を少なくとも1回ずつ通る |
「もし年齢が65以上なら、シニア割引を適用する」という処理(そうでなければ何もしない)があるとします。
- 命令網羅:割引を適用する命令を1回通ればよいので、70歳の1ケースで達成できる
- 分岐網羅:「65以上(真)」と「65未満(偽)」の両方を通す必要があるので、70歳と30歳の2ケースが必要
分岐網羅のほうが、より厳しい(多くのケースが必要な)基準です。
結合テストの進め方 ― スタブとドライバ
部品を組み合わせてテストしたいのに、相手の部品がまだ完成していないことがあります。そのときは仮のプログラムで代わりをさせます。
ドライバは「運転手」。上に乗って下位の部品を呼び出し、動かす役。 スタブは「切り株」。下で呼ばれるだけの、中身のない代役。 「上はドライバ、下はスタブ」とセットで覚えましょう。
そのほかのテスト
| テスト | 目的 |
|---|---|
| 回帰テスト(リグレッションテスト) | プログラムを修正した後、修正していない部分に悪影響が出ていないかを確かめる |
| 負荷テスト | 大量のデータやアクセスに耐えられるかを確かめる |
| 性能テスト | 応答時間や処理件数が要求を満たすかを確かめる |
| 運用テスト | 本番に近い環境・手順で、実際の業務に使えるかを確かめる |
直したところだけテストすればいいんじゃないんですか?
それが落とし穴なんだ。1か所直したら、思わぬ別の場所が動かなくなることがよくある。だから直していないところも含めて確かめ直すのが回帰テストだよ。
- ブラックボックステスト:中身を見ず、仕様(入力と出力)で確かめる。技法は同値分割と限界値分析
- 同値分割:グループごとに代表値を1つ選ぶ
- 限界値分析:グループの境目の両側の値を選ぶ(例:1〜100が有効なら 0・1・100・101)
- ホワイトボックステスト:中身(内部構造)を見て、命令網羅・分岐網羅を基準に確かめる
- スタブは未完成の下位モジュールの代わり(トップダウン)、ドライバは未完成の上位モジュールの代わり(ボトムアップ)
- 回帰テストは修正による「ほかへの悪影響」を確かめる