内部構造を見ず入力と出力の仕様に着目して検証するテスト。
ブラックボックステストとは、プログラムの内部構造(コードの中身)を見ず、入力と出力の仕様だけに着目して正しく動くかを確認するテストです。「この入力ならこの出力になるはず」という仕様書の期待値と、実際の出力を見比べます。
「ブラックボックス」とは中身の見えない黒い箱のこと。テストする人は箱の中(プログラムの作り)を知らなくてよく、外から見た振る舞いだけを確認します。仕様を作る人とテストする人が分かれていても実施できるのが利点です。
身近な例で考えると、自動販売機の動作確認に似ています。中の配線を知らなくても、「120円入れてお茶のボタンを押す → お茶が出る」という外から見た動きが仕様どおりかを確かめれば十分です。上の図解で、入力を入れて出力を期待値と比べる流れを確認できます。
入力の組み合わせは無数にあるため、効率よくバグを見つける技法が使われます。代表的なものは次の2つです。
・同値分割:入力を「同じ扱いになるグループ(同値クラス)」に分け、各グループから1つだけ代表値を選んで試す。たとえば年齢を「子供」「大人」に分け、それぞれ1つずつ試す
・限界値分析:グループの境目(境界値)とその前後を重点的に試す。バグは「ちょうど○○以上のとき」のような境界で起きやすいため
この2つはセットで使うのが基本です。同値分割で大まかに代表値を絞り、限界値分析で境界の前後(例: 17歳・18歳・19歳)を補えば、少ないテスト回数で多くの不具合を発見できます。
ほかにも、原因(入力条件)と結果(出力)の組み合わせを表にする原因結果グラフやデシジョンテーブルなどがあります。いずれも「内部構造を見ずに入力と出力の仕様から考える」という点で共通しています。
テストには大きく2つの考え方があります。着目する場所が「外(仕様)」か「中(構造)」かが決定的な違いです。
| 観点 | ブラックボックステスト | ホワイトボックステスト |
|---|---|---|
| 着目する点 | 入力と出力の仕様(外) | プログラムの内部構造(中) |
| コードを見るか | 見ない | 見る |
| 代表的な技法 | 同値分割・限界値分析 | 命令網羅・分岐網羅 |
| 主な実施工程 | 結合テスト・システムテスト | 単体テスト |
ブラックボックステストは「仕様どおりに動くか」を確かめ、ホワイトボックステストは「コードのすべての道筋を通せているか」を確かめます。前者は仕様の抜けや誤った出力を見つけやすく、後者は通っていない処理(テスト漏れ)を見つけやすいという特徴があります。
どちらが優れているということはなく、両方を組み合わせて補い合うのが実務の基本です。家にたとえると、ブラックボックスは「ドアが開くか・電気が点くか」という住む人目線の確認、ホワイトボックスは「配線がすべて正しくつながっているか」という工事担当者目線の確認に当たります。
コードの中身を知らなくてもテストできることが、ブラックボックステストの最大の利点です。なぜなら、開発者とテスト担当者が別々に作業を進められるからです。
テスト担当者は仕様書(「この入力でこの出力になるべき」という決め事)さえあれば、プログラムが完成する前からテストの計画を作れます。また、コードを書いた人は自分のミスに気づきにくいという傾向があるため、コードを知らない第三者が外から確認することで、見落とされやすいバグを発見しやすくなるという効果もあります。
ただし、ブラックボックスだけでは「通っていないコードの道筋(実行されない処理)」は見つけられないという弱点があります。たとえばエラー処理のコードが正しく書けているかどうかは、外から見るだけでは分かりません。そのためホワイトボックステスト(コードの中を確認する方法)と組み合わせて使います。
ブラックボックステストのテストケース(どの値で何を確かめるかの一覧)は、仕様書から機械的に作れるのが特徴です。大まかな流れは次のとおりです。
・①仕様を読む:「どんな入力のとき、どんな出力になるべきか」を仕様書から整理する
・②グループ分け(同値分割):入力を「同じ結果になる区画(同値クラス)」に分ける。例えば「有効な年齢/小さすぎる年齢/大きすぎる年齢」の3グループ
・③代表値と境界値を選ぶ:各グループから代表値を1つ、さらにグループの境目(境界)の前後の値も追加する
・④実際に入力して確かめる:選んだ値をプログラムに入れ、出力が仕様の期待値と一致するかを確認する
この手順を踏むことで、ありえる入力の数が何千・何万あっても、少数の代表値で効率よく確認できます。「年齢入力」の例なら、0〜130の全131通りを試さなくても、10(子ども代表)・17・18・19(境界前後)・50(大人代表)・130(上限代表)などに絞ってテストできます。