- 検証・テスト
テスト技法一覧|ブラックボックス・ホワイトボックスの種類と選び方早見表
テスト技法は、テストケースを「勘」ではなく「理由のある選び方」で作るための方法です。 JSTQB(ISTQB の日本の団体)の Foundation Level シラバス 4.0 は、テスト技法を ブラックボックス・ホワイトボックス・経験ベース の3つに分けています。
| 分類 | 何をもとにテストを作るか | 主な技法 | 主に使う人 |
|---|---|---|---|
| ブラックボックス | 仕様(入力と出力、ルール) | 同値分割法、境界値分析、デシジョンテーブル、状態遷移、ペアワイズ、ユースケーステスト | テスト担当者・開発者 |
| ホワイトボックス | コードの構造(分岐・条件) | ステートメント、ブランチ、条件、MC/DC | 開発者 |
| 経験ベース | 過去の不具合・知識・その場の観察 | エラー推測、探索的テスト、チェックリストベースドテスト | 経験のあるテスト担当者 |
確認環境:カバレッジの比較は、Python 3.11.15・pytest 9.1.1・coverage.py 7.16.2(Linux)で測りました。条件カバレッジと MC/DC は、coverage.py では測れないため、真理値表を数える Python のスクリプトで確かめています。選び方のフロー図は Mermaid 12.1.0 で描画できることを確かめました。技法の定義は ISTQB CTFL シラバス v4.0 の第4章で確かめています(確認日 2026年10月12日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「テスト技法一覧|ブラックボックス・ホワイトボックスの種類と選び方早見表」
テスト技法の早見表
表の「件数の目安」は、その技法で「最低限そろえるテストケースの数」の考え方です。 実際の件数は、条件や値の数で決まります。
ブラックボックス技法
| 技法 | 何を見つけるのに効くか | 件数の目安 | 向く対象 |
|---|---|---|---|
| 同値分割法 | 「同じ扱いのはずの値」で扱いが違う不具合 | 同値クラス(同じ扱いの値のまとまり)ごとに1件。無効なクラスは1件に1つずつ | 入力チェック、区分ごとの処理 |
| 境界値分析 | 「以上」と「より大きい」の取り違え(<= と <) |
2値:境界ごとに2件。3値:境界ごとに3件 | 金額・年齢・日付・件数の上限下限 |
| デシジョンテーブル | 条件の組み合わせの漏れ、ルールの矛盾 | 実現できるルール(列)の数。条件が n 個なら最大 2^n | 料金・割引・権限・審査のルール |
| 状態遷移テスト | してはいけない遷移ができる、状態の更新漏れ | 有効な遷移の数(0スイッチ)。無効な遷移は1件に1つ | 申請・注文・会員のステータス、画面遷移 |
| ペアワイズ(組み合わせ) | 2つの条件の組み合わせで起きる不具合 | 値の数が多い条件の上位2つの値の数をかけた数が下限 | 環境(OS×ブラウザ)、設定の組み合わせ |
| ユースケーステスト | 業務の流れの中の抜け、例外の終わり方 | 基本フロー1件+代替・例外フローごとに1件 | 業務シナリオ、システムテスト・受入テスト |
ホワイトボックス技法
| 技法(カバレッジ) | 何を見つけるのに効くか | 件数の目安(条件 n 個の判定1つ) | 向く対象 |
|---|---|---|---|
| ステートメント | 一度も動かしていない行 | すべての行を1回通る数 | すべてのコード(最初の目安) |
| ブランチ(判定) | if の「通らない側」の処理の誤り | 判定ごとに真と偽で2件 | 分岐のあるコード全般 |
| 条件 | 個々の条件式の誤り | 各条件の真と偽。最小で2件になることもある | 複合条件(and・or)のあるコード |
| MC/DC | 「その条件が結果に効いていない」誤り | 最小で n+1 件(この記事の例では3条件で4件) | 安全性が求められる制御、重要な判定 |
| 複数条件 | 条件のすべての組み合わせの誤り | 2^n 件(3条件で8件) | 条件が少なく、重要な判定 |
経験ベースの技法
| 技法 | 何を見つけるのに効くか | 件数の目安 | 向く対象 |
|---|---|---|---|
| エラー推測 | 開発者がしやすい誤り、過去に起きた不具合 | 誤りのリストの項目ごとに1件 | 仕様に書かれにくい入力・操作 |
| 探索的テスト | 仕様書から作ったテストでは見つからない不具合 | 件数ではなく時間で区切る(セッション) | 仕様が少ない機能、新しい画面、リリース前の確かめ |
| チェックリストベースドテスト | 毎回確かめるべき観点の抜け | チェック項目の数 | 画面の共通ルール、非機能の確認 |
各技法の詳しいやり方は、次の関連記事で扱っています。
- 同値分割・境界値:関連記事「同値分割・境界値分析|テストケース表とpytestコード例で解説」で扱っています。
- デシジョンテーブル:関連記事「デシジョンテーブルの書き方と例5題|条件の簡単化とテストケースの作り方」で扱っています。
- 状態遷移:関連記事「状態遷移図と状態遷移表の書き方|テスト設計とMermaid・PlantUML」で扱っています。
- ペアワイズ:関連記事「ペアワイズテストのやり方|108通りを12件にする手順」で扱っています。
ブラックボックス技法のポイント
ブラックボックス技法は、仕様書だけでテストケースを作れます。 そのため、コードができる前にテストを設計できます。
- 同値分割法と境界値分析は、ほぼいつも一緒に使います。 同値分割で「どの区分を試すか」を決め、境界値分析で「区分の端のどの値を試すか」を決めます。ISTQB のシラバスでは、境界値分析に 2値(境界の値と、隣の区分のいちばん近い値)と 3値(境界の値と、その両隣)の2つがあり、3値のほうが厳しいとされています。たとえば
x <= 10が誤ってx == 10になっていると、2値の 10・11 では見つからず、3値で加わる 9 で見つかります。 - デシジョンテーブルは「条件の組み合わせで結果が決まる」ものに使います。 カバレッジは「試したルール(列)の数 ÷ 実現できるルールの数」です。
- 状態遷移テストには、3つのカバレッジがあります。 全状態(すべての状態を通る)、有効遷移(すべての正しい遷移を通る。0スイッチとも呼ぶ)、全遷移(無効な遷移も試す)です。シラバスでは、有効遷移が最も広く使われ、全遷移は有効遷移と全状態の両方を含むとされています。無効な遷移は、1つのテストケースで1つだけ試します(不具合が隠れるのを防ぐため)。
ホワイトボックス技法:カバレッジを小さなコードで比べる
カバレッジの種類の違いは、条件が複数ある if 文で比べると分かりやすくなります。 送料を決める次の関数で、4つのテストの組(a〜d)を試しました。
# fee.py
def shipping_fee(total, is_member, has_coupon):
fee = 500
if is_member and (total >= 5000 or has_coupon):
fee = 0
return fee
判定は1つ(if)、条件は3つ(is_member、total >= 5000、has_coupon)です。下の表の「T/F」は、3つの条件の真(T)・偽(F)を順に並べたものです。
| テストの組 | 入力(条件の T/F) | ステートメント | ブランチ | 条件・MC/DC |
|---|---|---|---|---|
| a(1件) | TTF | 100% | 86%(3->5 が未通過) |
条件:満たさない/MC/DC:満たさない |
| b(2件) | TTF、FTF | 100% | 100% | 条件:満たさない/MC/DC:満たさない |
| c(2件) | TTT、FFF | 100% | 100% | 条件:満たす(真理値表の上)/MC/DC:満たさない |
| d(4件) | TTF、FTF、TFF、TFT | 100% | 100% | 条件:満たす/MC/DC:満たす |
coverage.py で測った結果
ステートメントとブランチは、coverage.py で測りました。テストの組 a(1件)の結果です。
$ coverage run -m pytest -q test_a.py && coverage report -m --include=fee.py
Name Stmts Miss Cover Missing
--------------------------------------
fee.py 5 0 100%
--------------------------------------
TOTAL 5 0 100%
$ coverage run --branch -m pytest -q test_a.py && coverage report -m --include=fee.py
Name Stmts Miss Branch BrPart Cover Missing
----------------------------------------------------
fee.py 5 0 2 1 86% 3->5
----------------------------------------------------
TOTAL 5 0 2 1 86%
- 1件でステートメントは 100% になりました。 if の中の
fee = 0も通るからです。 --branchを付けると 86% に下がり、3->5(3行目の if から5行目へ飛ぶ、つまり「条件が偽」の道)を通っていないことが分かります。 coverage.py のドキュメントでは、Missing の3->5のような表記は「遷移元->遷移先」の分岐を通っていないことを表すと説明されています。- 86% は、ステートメント5つと分岐2つのうち、通った6つの割合(6 ÷ 7)です。coverage.py は
--branchのとき、分岐の割合も合計のカバー率に含めます。 - テストの組 b・c・d は、どれもブランチ 100% でした。coverage.py では、b と d の差(条件・MC/DC)は見えません。
coverage report --fail-under=100 を付けると、基準に届かないときにコマンドが失敗します。テストの組 a では「Coverage failure: total of 86 is less than fail-under=100」と表示され、終了コードは 2 でした。CI で基準を割ったときに止めるのに使えます。pytest とカバレッジの設定は、関連記事「pytest 使い方|導入からfixture・mock・カバレッジまで実行結果つき」で扱っています。
条件カバレッジと MC/DC を数える
条件カバレッジは「各条件が真と偽の両方をとったか」、MC/DC は「各条件が、ほかの条件を変えずに、それだけで判定の結果を変えられることを示したか」を見ます。 次のスクリプトで、真理値表から数えました。
from itertools import product, combinations
def dec(a, b, c): # a=is_member, b=total>=5000, c=has_coupon
return a and (b or c)
def decision_cov(ts): return {dec(*t) for t in ts} == {True, False}
def condition_cov(ts): return all({t[i] for t in ts} == {True, False} for i in range(3))
def mcdc(ts):
if not (decision_cov(ts) and condition_cov(ts)):
return False
for i in range(3): # 条件 i だけが違い、判定の結果も違う2件があるか
if not any(all(x[j] == y[j] for j in range(3) if j != i)
and x[i] != y[i] and dec(*x) != dec(*y)
for x, y in combinations(ts, 2)):
return False
return True
ALL = list(product([True, False], repeat=3))
for name, f in [("判定", decision_cov), ("条件", condition_cov), ("MC/DC", mcdc)]:
k = next(k for k in range(1, 9) if any(f(list(s)) for s in combinations(ALL, k)))
print(name, "の最小件数:", k)
判定 の最小件数: 2
条件 の最小件数: 2
MC/DC の最小件数: 4
テストの組 d(4件)が MC/DC を満たす理由は、次の3つのペアがあるからです。
| 条件 | ペア(ほかの条件は同じ) | 判定の結果 |
|---|---|---|
is_member |
TTF と FTF | 送料0 → 送料500 |
total >= 5000 |
TTF と TFF | 送料0 → 送料500 |
has_coupon |
TFF と TFT | 送料500 → 送料0 |
テストの組 c(TTT・FFF)は、条件カバレッジは満たしますが、MC/DC は満たしません。 たとえば has_coupon を False に固定する誤りがあっても、TTT は total >= 5000 が真なので送料0のまま、FFF は is_member が偽なので送料500のままで、どちらのテストも通ってしまいます。実際に has_coupon を False に置き換えた関数で試すと、テストの組 c の2件は期待どおりの値を返し、テストの組 d では TFT(期待は送料0)が送料500になって、誤りが見つかりました。
注意:Python の and・or は「短絡評価」です。 左の条件で結果が決まると、右の条件は評価されません。FFF では is_member が偽なので、total >= 5000 と has_coupon は実際には評価されません。上の表は、真理値表の上で数えたものです。実際に評価された値で数えると、テストの組 c では has_coupon が一度も評価されず、条件カバレッジも満たしません。MC/DC が求められる分野では、短絡評価を考えたツールで測ります。
MC/DC は、NIST の用語集で「米国連邦航空局(FAA)が求める強いカバレッジ基準」と説明されています。 条件が n 個のとき、すべての組み合わせ(2^n 件)より少ない件数(この例では 8件ではなく4件)で、各条件が効いていることを示せるのが利点です。
経験ベースの技法
経験ベースの技法は、仕様から作ったテストの「すき間」を埋めるために使います。 シラバスでは、エラー推測を体系的に行う方法として「フォールトアタック」(起こりそうな誤りのリストを作り、それを起こすテストを設計する)が挙げられています。
エラー推測のリスト(システム開発の例)
| 分類 | 試す値・操作 | ねらう誤り |
|---|---|---|
| 件数 | 0件、1件、上限ちょうど、上限+1 | 空の一覧で落ちる、ページ送りの誤り |
| 文字 | 全角・半角、空白だけ、絵文字、改行、とても長い文字列 | 文字数の数え方、画面の崩れ、DB の桁あふれ |
| 日付・時刻 | 2月29日、月末、年度替わり、日付の変わる 0:00 前後 | 締め処理・集計期間の誤り |
| 数値 | 0、負の数、小数、最大値 | 0 での割り算、丸めの誤り、オーバーフロー |
| 操作 | 二度押し、ブラウザの戻る、別タブで同時に更新 | 二重登録、ほかの人の更新を上書きする |
| 外部 | 連携先が遅い・止まる・エラーを返す | タイムアウトの処理漏れ、再送で二重処理 |
| 権限 | URL を直接入力、ほかの人の ID に書き換える | 権限チェックの漏れ |
過去のバグ報告から、このリストを増やしていくと、チームの「よくある誤り」が分かります。バグの記録の項目は、関連記事「バグ管理表の項目とテンプレート|優先度・重要度とステータス遷移」で扱っています。
探索的テストのチャーター(テンプレート)
探索的テストは、テストの設計・実行・評価を同時に進めながら、対象について学んでいくテストです。 シラバスでは、時間を区切った「セッション」で行い、目的を書いた「テストチャーター」を指針にして、終わったあとに振り返る(デブリーフィング)進め方が紹介されています。
## 探索的テスト チャーター
- 対象:注文の確定画面(v2.3 の変更分)
- 目的:決済サービスが遅いとき・失敗したときの注文の状態を探る
- 時間:60 分
- 使うもの:テスト用カード(承認・拒否・遅延)、管理画面
- 見るところ:二重決済、在庫の戻し、画面に出るメッセージ
### 記録(終わったあとに書く)
- 試したこと:
- 見つかった不具合:(バグ報告の番号)
- 気になったこと・次に試すこと:
見つかった不具合の書き方は、関連記事「バグ報告の書き方|コピペ用テンプレートと重大度判定表」で扱っています。
テスト技法の選び方
選ぶときは「対象の特徴」から考えます。 1つの機能に、複数の技法を組み合わせることがほとんどです。
flowchart TD
q0{仕様書に入力と出力が書かれているか}
q0 -- いいえ --> x1[探索的テスト・エラー推測で試し、<br>分かったことを仕様に戻す]
q0 -- はい --> q1{入力に範囲や区分があるか}
q1 -- はい --> t1[同値分割法+境界値分析]
q1 -- 続けて確かめる --> q2{複数の条件の組み合わせで<br>結果が決まるか}
q2 -- はい・ルールが決まっている --> t2[デシジョンテーブル]
q2 -- はい・独立した条件が多い --> t3[ペアワイズ]
q2 -- 続けて確かめる --> q3{状態や順番で<br>動きが変わるか}
q3 -- はい --> t4[状態遷移テスト]
q3 -- 続けて確かめる --> q4{業務の流れとして<br>確かめるか}
q4 -- はい --> t5[ユースケーステスト]
t1 & t2 & t3 & t4 & t5 --> w1[コードのカバレッジを測り、<br>通っていない分岐を確かめる]
w1 --> e1[エラー推測・探索的テストで<br>すき間を埋める]
| 対象の例 | まず使う技法 | 組み合わせる技法 |
|---|---|---|
| 入力フォーム(会員登録) | 同値分割法・境界値分析 | エラー推測(文字・二度押し) |
| 料金・割引の計算 | デシジョンテーブル | 境界値分析(金額の境目)、MC/DC(重要な判定) |
| 申請・注文のステータス | 状態遷移テスト | ユースケーステスト(業務の流れ) |
| 対応ブラウザ・端末の確認 | ペアワイズ | チェックリスト(画面の共通ルール) |
| 業務シナリオ(受注〜請求) | ユースケーステスト | 探索的テスト |
| 共通ライブラリ・計算の関数 | ブランチカバレッジ | 境界値分析 |
| 修正後の確かめ | 影響範囲から選んだテストの再実行 | 探索的テスト(変更した画面) |
修正後に流すテストの範囲は、関連記事「リグレッションテストの範囲の決め方|影響範囲の調べ方」で扱っています。
テストレベルとの対応
| テストレベル | よく使う技法 | 主な観点 |
|---|---|---|
| 単体テスト | 同値分割・境界値、ブランチカバレッジ | 関数・クラスの入出力と分岐 |
| 結合テスト | デシジョンテーブル、状態遷移 | 部品のつながり、データの受け渡し |
| システムテスト | ユースケーステスト、ペアワイズ、探索的テスト | 業務の流れ、環境の組み合わせ |
| 受入テスト | ユースケーステスト、チェックリスト | 業務に使えるか |
単体テストと結合テストの違いは、関連記事「単体テストと結合テストの違い|pytestの実例と実行結果で比較」で扱っています。
よくある質問
Q. カバレッジは何%を目標にすればよいですか。 A. 目標の値は、対象の重要さに合わせてプロジェクトで決めます。この記事の例のように、ステートメント 100% でも分岐の片方を通っていないことがあるため、目標は「ブランチカバレッジで何%」と種類まで決めておくと、意味がそろいます。
Q. ブラックボックスとホワイトボックスは、どちらを先にやりますか。 A. 多くは、仕様からブラックボックスでテストケースを作り、実行したあとにカバレッジを測って、通っていない分岐をホワイトボックスの観点で足します。仕様から作ったテストで通らない分岐は、「仕様の漏れ」か「要らないコード」のどちらかであることが多く、確かめる価値があります。
Q. 探索的テストと、手当たり次第のテスト(アドホックテスト)は違いますか。 A. 探索的テストは、チャーターで目的と時間を決め、試したことと見つかったことを記録します。記録があるので、何を確かめたかを後で説明できます。
Q. テストケースの作成に生成AIを使えますか。 A. 技法の名前と条件を指示すると、下書きは作れます。ただし、境界の値や組み合わせが正しいかは、この記事のスクリプトのような方法で確かめます。関連記事「生成AIでテストケースを作るプロンプト集|同値分割・境界値対応」で扱っています。
まとめ
- テスト技法は ブラックボックス・ホワイトボックス・経験ベース の3つに分かれる
- ブラックボックスは 同値分割・境界値・デシジョンテーブル・状態遷移・ペアワイズ・ユースケース。対象の特徴で選び、組み合わせる
- カバレッジは ステートメント < ブランチ < 条件/判定 < MC/DC < 複数条件 の順に厳しい。例では 1件でステートメント 100%、ブランチは 86%、MC/DC は 3条件で最小4件
- coverage.py で測れるのは ステートメントとブランチまで。条件・MC/DC は別の方法で確かめる
- 経験ベースの エラー推測・探索的テスト で、仕様から作ったテストのすき間を埋める
参考・出典
確認日はいずれも 2026年10月12日です。
- JSTQB「テスト技術者資格制度 Foundation Level シラバス Version 4.0」:https://jstqb.jp/dl/JSTQB-SyllabusFoundation_VersionV40.J02.pdf
- ASTQB「CTFL v4.0 Chapter 4: Test Analysis and Design」:https://study.astqb.org/?p=22
- coverage.py 7.16.2「Branch coverage measurement」:https://coverage.readthedocs.io/en/latest/branch.html
- NIST CSRC Glossary「modified condition decision coverage」:https://csrc.nist.gov/glossary/term/modified_condition_decision_coverage
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「テスト技法一覧|ブラックボックス・ホワイトボックスの種類と選び方早見表」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。