最終更新日:2026年9月12日
ds data-engineering python
まず結論
ブラックボックステストとホワイトボックステストの違いは、何を基準にテスト項目を作るかです。
仕様・入力・出力を基準にする
→ ブラックボックステスト
プログラムの内部構造・分岐を基準にする
→ ホワイトボックステスト
迷ったときは、次の質問で判断できます。
テスト項目を作るために、プログラムの中身を見る必要があるか?
- 中身を見ず、仕様から作れる → ブラックボックステスト
- ソースコードや処理経路を見る → ホワイトボックステスト
DS検定では、用語の意味を覚えるだけでなく、簡単な仕様やプログラムからテスト項目を作成し、実施できることが重要です。
直感的な説明
製品検査に置き換えて考えてみましょう。
完成した装置に値を入力し、期待した動作をするか確認するのが、ブラックボックステストに近い考え方です。
決められた値を入力する
↓
仕様どおりに動くか確認する
この場合、装置内部の制御方法を知らなくても検査できます。
一方、制御プログラムを確認し、
正常処理の経路を通ったか
異常処理の経路を通ったか
判定の真側と偽側を通ったか
を調べるのが、ホワイトボックステストに近い考え方です。
同じプログラムをテストしていても、注目する場所が異なります。
外から見える動作を確認
→ ブラックボックステスト
内部の処理経路を確認
→ ホワイトボックステスト
定義・仕組み
両者を比較すると、次のようになります。
| 比較項目 | ブラックボックステスト | ホワイトボックステスト |
|---|---|---|
| 主に見るもの | 外部仕様、入力、出力 | ソースコード、内部構造、分岐 |
| テスト項目の根拠 | 仕様書や要求事項 | プログラムの処理内容 |
| 内部構造の確認 | 基本的に不要 | 必要 |
| 代表的な考え方 | 同値分割、境界値分析 | 命令や分岐の網羅 |
| 見つけやすい問題 | 仕様と異なる動作 | 通っていない処理や分岐 |
| 見つけにくい問題 | 外部動作に現れない内部の問題 | 仕様そのものの不足や誤り |
同じプログラムで違いを確認する
点数を判定する次の関数を考えます。
仕様
入力できる点数は0~100点
60点以上
→ 合格
60点未満
→ 不合格
0未満または100を超える値
→ 入力エラー
Pythonで実装すると、次のようになります。
def judge_score(score):
if score < 0 or score > 100:
return "入力エラー"
if score >= 60:
return "合格"
return "不合格"
ブラックボックステストの項目を作る
ブラックボックステストでは、ソースコードではなく、先ほどの仕様から入力値を選びます。
まず、入力を同じ結果になるグループに分けます。
| 入力範囲 | 期待される結果 |
|---|---|
| 0未満 | 入力エラー |
| 0~59 | 不合格 |
| 60~100 | 合格 |
| 101以上 | 入力エラー |
このように、同じように処理される入力をグループに分ける考え方を同値分割といいます。
さらに、不具合が起きやすい境界付近を確認します。
| テスト番号 | 入力値 | 期待結果 | 確認する境界 |
|---|---|---|---|
| 1 | -1 | 入力エラー | 下限の直前 |
| 2 | 0 | 不合格 | 下限 |
| 3 | 59 | 不合格 | 合格点の直前 |
| 4 | 60 | 合格 | 合格点 |
| 5 | 100 | 合格 | 上限 |
| 6 | 101 | 入力エラー | 上限の直後 |
これは、境界値分析を使ったテスト項目です。
重要なのは、このテスト項目をプログラムの中身ではなく、仕様から作っていることです。
ホワイトボックステストの項目を作る
ホワイトボックステストでは、プログラム内部の分岐を確認します。
先ほどの関数には、主に次の3つの処理経路があります。
経路1:入力範囲外
→ 「入力エラー」を返す
経路2:入力範囲内かつ60点以上
→ 「合格」を返す
経路3:入力範囲内かつ60点未満
→ 「不合格」を返す
それぞれの経路を通すテスト項目を作ると、例えば次のようになります。
| テスト番号 | 入力値 | 通す処理 | 期待結果 |
|---|---|---|---|
| 1 | -1 | 入力範囲外の処理 | 入力エラー |
| 2 | 60 | 合格の処理 | 合格 |
| 3 | 59 | 不合格の処理 | 不合格 |
このテスト項目は、ソースコードの分岐を見て作っているため、ホワイトボックステストです。
Pythonでテストを実施する
作成したテスト項目は、assertを使って簡単に実行できます。
def judge_score(score):
if score < 0 or score > 100:
return "入力エラー"
if score >= 60:
return "合格"
return "不合格"
test_cases = [
(-1, "入力エラー"),
(0, "不合格"),
(59, "不合格"),
(60, "合格"),
(100, "合格"),
(101, "入力エラー"),
]
for score, expected in test_cases:
actual = judge_score(score)
assert actual == expected
print("すべてのテストに合格しました")
assertでは、実際の結果と期待結果が一致するか確認しています。
actual == expected
→ テスト合格
actual != expected
→ AssertionErrorが発生
実務では、テスト項目ごとに次の情報を残しておくと確認しやすくなります。
| 項目 | 内容 |
|---|---|
| 入力値 | プログラムに与えるデータ |
| 期待結果 | 仕様上、返されるべき結果 |
| 実際の結果 | プログラムが返した結果 |
| 判定 | 合格または不合格 |
| テストの目的 | どの仕様・分岐を確認するか |
どんな場面で使う?
ブラックボックステストが向いている場面
外部から見える機能が、仕様どおりに動くか確認するときに使います。
例えば、データ分析やデータ処理では次のような場面があります。
- CSVファイルを指定すると正しく読み込めるか
- 欠損値がある場合に決められた処理になるか
- APIに正しい値を送ると期待した結果が返るか
- 入力可能な数値の範囲を超えた場合にエラーになるか
- 集計結果が仕様どおりの形式で出力されるか
利用者の立場から、入力と出力を確認する場面に向いています。
ホワイトボックステストが向いている場面
内部の処理や分岐が正しく実行されるか確認するときに使います。
例えば、次のような場面があります。
- 正常処理と異常処理の両方を通したか
if文の真側と偽側を確認したか- 使われていない処理が残っていないか
- 例外処理が実行されるか
- 特定の条件でしか通らない経路を確認したか
プログラムの内部構造を理解したうえで、処理の見落としを減らすために使います。
実務では両方を組み合わせる
ブラックボックステストとホワイトボックステストは、どちらか一方だけを選ぶものではありません。
仕様どおりの結果になるか
→ ブラックボックステスト
内部の必要な処理を通っているか
→ ホワイトボックステスト
両方を組み合わせることで、外部の動作と内部の処理を異なる方向から確認できます。
よくある誤解・混同
誤解1:開発者が行うとホワイトボックステスト
誰がテストするかだけでは区別できません。
開発者が実施していても、仕様と入出力を基準にテスト項目を作ればブラックボックステストです。
判断する基準は、担当者ではなく、テスト項目を何から作ったかです。
誤解2:完成後に行うのがブラックボックステスト
実施する時期だけでも区別できません。
仕様からテスト項目を作る
→ ブラックボックステスト
内部構造からテスト項目を作る
→ ホワイトボックステスト
開発中か完成後かは、本質的な違いではありません。
誤解3:入力値だけでテストの種類が決まる
同じ入力値が、両方のテストで使われることがあります。
例えば、60という入力値を、
- 合格点の境界として仕様から選んだ → ブラックボックステスト
- 合格処理の分岐を通すために選んだ → ホワイトボックステスト
という場合があります。
大切なのは入力値そのものではなく、その値を選んだ根拠です。
誤解4:ホワイトボックステストだけで十分
内部の分岐をすべて通しても、仕様そのものが間違っていれば、利用者が必要とする動作にはなりません。
反対に、ブラックボックステストだけでは、外部の結果に現れない未実行の処理や不要なコードを見落とすことがあります。
両者は目的が異なるため、組み合わせて使います。
誤解5:網羅率が100%なら不具合はない
すべての命令や分岐を実行しても、すべての入力値や仕様上の問題を確認できたとは限りません。
網羅率は、内部構造をどこまで実行したかを見る指標であり、プログラムが完全に正しいことを保証するものではありません。
まとめ(試験直前用)
- 仕様・入力・出力からテスト項目を作る → ブラックボックステスト
- 内部構造・処理経路・分岐からテスト項目を作る → ホワイトボックステスト
- ブラックボックスでは、同値分割や境界値分析が使われる
- ホワイトボックスでは、命令や分岐を通したか確認する
- 「誰が・いつ実施するか」ではなく、テスト項目を作った根拠で判断する
- 実務では、外部仕様と内部構造の両方を確認するために組み合わせて使う
より詳しいテスト手法は、FEのブラックボックステストとホワイトボックステストの比較記事で確認できます。
対応スキル項目(ver.6 データエンジニアリング力シート)
- 位置づけ:★1直接対応
- 項目ID:
dataengineering-0114 - 到達点:ブラックボックステストとホワイトボックステストの違いを理解し、簡単なテスト項目を作成して実施できる
- ver.6 ★1スキルチェックで確認する