ペアワイズテストとは、複数のパラメータの組み合わせを「任意の2つのパラメータが最低1回ずつテストされる」ことで保証しながら、テストケース数を大幅に削減するテスト設計技法です。OS・ブラウザ・設定項目の組み合わせ爆発を効率よく解消できます。
💡 一言でいうと
ペアワイズテスト = 「全組み合わせをテストせずに、ペアの網羅性でバグを効率よく発見する手法」
ペアワイズテストを使うと「全パターンをテストしなければ」というプレッシャーから解放され、少ないテストケースで高いバグ検出率を実現できます。研究によると、ほとんどのバグは2つのパラメータの相互作用から発生するからです。
📌 この記事はこんな方におすすめ
- ペアワイズテストを初めて学ぶQAエンジニア・開発者
- 組み合わせテストのケース数が多すぎて困っている方
- OS・ブラウザ・設定項目の組み合わせテストを効率化したい方
- デシジョンテーブルでは条件が多すぎる場面を解決したい方
✅ この記事を読むと得られること
- ペアワイズテストの考え方とテストケース削減の仕組みがわかる
- allpairspyを使ったPythonでのテストケース自動生成方法がわかる
- pytestのparametrizeとの組み合わせで自動テストに活かせる
👤 この記事を書いた人
QAエンジニア・テスト自動化エンジニアとして15年以上の実務経験を持つ Yoshi が執筆。ペアワイズテストは設定項目が多いシステムやクロスブラウザテストで実際に活用している技法です。実装コードはGitHubで公開中:github.com/YOSHITSUGU728/automated-testing-portfolio
「OS3種類 × ブラウザ4種類 × 言語設定2種類 = 24パターン」——設定項目が増えるたびにテスト数が指数的に膨らんでいませんか?
- 条件が増えるたびに全組み合わせが爆発的に増えてテストが追いつかない
- 全パターンを実行する時間もリソースもない
- かといってテストを削りすぎると見落としが心配
ペアワイズテストはこうした問題を解決する技法です。この記事では概念から具体的なテストケース生成・pytestへの応用まで一気通貫で解説します。
📌 結論
- 「任意の2つのパラメータの組み合わせが最低1回テストされる」ことを保証するテスト設計技法
- 3パラメータ×3値=27パターンを9〜12パターン程度に削減できる
- Pythonの
allpairspyでテストケースを自動生成しparametrizeに渡すと自動テストに即変換できる
ペアワイズテストとは?
ペアワイズテスト(Pairwise Testing)とは、「複数のパラメータの中から任意の2つのペアが必ず1回以上テストされる」最小限のテストケースセットを生成するテスト設計技法です。「2因子間網羅」「オールペア法」とも呼ばれます。
なぜ「2つのペア」で十分なのかというと、研究によってほとんどのバグは1〜2つのパラメータの組み合わせによって引き起こされることが示されているためです。3つ以上のパラメータが同時に特定の値になって初めて発生するバグは非常にまれです。
| テスト手法 | 3パラメータ×3値の場合 | 特徴 |
|---|---|---|
| 全組み合わせ | 27パターン | 完全な網羅性・現実的でない |
| ペアワイズテスト | 9〜12パターン | ペアの網羅性・高いバグ検出率 |
| ランダムサンプリング | 任意 | 再現性なし・網羅性の保証なし |
ペアワイズテストの仕組みとは?
ペアワイズテストがどうテストケースを削減するか、具体例で確認します。
例:Webアプリのクロス環境テスト
次の3つのパラメータを持つシステムをテストする場合を考えます。
📋 テストパラメータ
| パラメータ | 値① | 値② | 値③ |
|---|---|---|---|
| OS | Windows | macOS | Linux |
| ブラウザ | Chrome | Firefox | Safari |
| 言語設定 | 日本語 | 英語 | 韓国語 |
全組み合わせ:3 × 3 × 3 = 27パターン → ペアワイズ:9パターン程度に削減
ペアワイズ法で生成された9パターン
| # | OS | ブラウザ | 言語設定 |
|---|---|---|---|
| 1 | Windows | Chrome | 日本語 |
| 2 | Windows | Firefox | 英語 |
| 3 | Windows | Safari | 韓国語 |
| 4 | macOS | Chrome | 英語 |
| 5 | macOS | Firefox | 韓国語 |
| 6 | macOS | Safari | 日本語 |
| 7 | Linux | Chrome | 韓国語 |
| 8 | Linux | Firefox | 日本語 |
| 9 | Linux | Safari | 英語 |
この9パターンで「OS×ブラウザ」「OS×言語設定」「ブラウザ×言語設定」のすべての組み合わせが最低1回カバーされます。27パターンから67%削減しながら、2パラメータ間の網羅性は完全に保たれています。
デシジョンテーブルとの違いとは?
同じ「組み合わせテスト」系の技法でも、デシジョンテーブルとペアワイズテストは使い分けるべき場面が明確に異なります。
| 比較項目 | デシジョンテーブル | ペアワイズテスト |
|---|---|---|
| 条件の数 | 2〜5個程度 | 5個以上でも対応可能 |
| 網羅性 | 全組み合わせを網羅 | 2パラメータ間のペアを網羅 |
| 得意な場面 | 業務ロジック・権限管理 | 環境設定・パラメータ組み合わせ |
| 条件間の依存 | 依存関係を明示できる | 独立したパラメータに向いている |
💡 判断基準
- 条件が2〜5個・業務ロジックの検証 → デシジョンテーブル
- 条件が5個以上・環境やパラメータの組み合わせ → ペアワイズテスト
- 条件間に強い依存関係がある → デシジョンテーブルの方が安全
allpairspyを使ったテストケース自動生成
ペアワイズテストのケースを手動で設計するのは難しいため、実務では allpairspy(Python)などのツールで自動生成します。
インストール
pip install allpairspyテストケースの自動生成
from allpairspy import AllPairs
# パラメータを定義
parameters = [
["Windows", "macOS", "Linux"], # OS
["Chrome", "Firefox", "Safari"], # ブラウザ
["日本語", "英語", "韓国語"], # 言語設定
]
# ペアワイズテストケースを自動生成
test_cases = [case.test_parameters for case in AllPairs(parameters)]
for i, case in enumerate(test_cases, 1):
print(f"ケース{i}: OS={case[0]}, ブラウザ={case[1]}, 言語={case[2]}")実行結果(出力例)
ケース1: OS=Windows, ブラウザ=Chrome, 言語=日本語
ケース2: OS=Windows, ブラウザ=Firefox, 言語=英語
ケース3: OS=Windows, ブラウザ=Safari, 言語=韓国語
ケース4: OS=macOS, ブラウザ=Chrome, 言語=英語
ケース5: OS=macOS, ブラウザ=Firefox, 言語=韓国語
ケース6: OS=macOS, ブラウザ=Safari, 言語=日本語
ケース7: OS=Linux, ブラウザ=Chrome, 言語=韓国語
ケース8: OS=Linux, ブラウザ=Firefox, 言語=日本語
ケース9: OS=Linux, ブラウザ=Safari, 言語=英語
# 27パターン → 9パターンに削減!allpairspy が自動で最適なテストセットを計算します。4パラメータ×3値=81パターンも12〜15パターン程度に削減できます。pytestのparametrizeとの組み合わせ
生成したテストケースをそのままpytestの @pytest.mark.parametrize に渡すことで、自動テストに即変換できます。
import pytest
from allpairspy import AllPairs
# パラメータを定義
parameters = [
["Windows", "macOS", "Linux"],
["Chrome", "Firefox", "Safari"],
["日本語", "英語", "韓国語"],
]
# allpairspyでテストケースを生成
pairwise_cases = [case.test_parameters for case in AllPairs(parameters)]
# そのままparametrizeに渡す
@pytest.mark.parametrize("os, browser, language", pairwise_cases)
def test_web_app_cross_env(os, browser, language):
"""ペアワイズテスト:クロス環境でWebアプリが正常動作するか確認"""
print(f"テスト環境: {os} / {browser} / {language}")
# ここに実際のテストロジックを記述
# 例:Playwrightでブラウザを起動して検証など
assert True # 実装時はここに検証コードを追加実行結果サンプル
$ pytest test_pairwise.py -v
collected 9 items
test_pairwise.py::test_web_app_cross_env[Windows-Chrome-日本語] PASSED
test_pairwise.py::test_web_app_cross_env[Windows-Firefox-英語] PASSED
test_pairwise.py::test_web_app_cross_env[Windows-Safari-韓国語] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Chrome-英語] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Firefox-韓国語] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Safari-日本語] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Chrome-韓国語] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Firefox-日本語] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Safari-英語] PASSED
========================== 9 passed in 0.08s ===========================allpairspy で生成したケースをそのまま parametrize に渡す設計にしておくと、パラメータが追加・変更されてもコードの修正が最小限で済みます。パラメータリストを設定ファイルやフィクスチャで管理するとさらに保守性が高まります。ペアワイズテストが特に有効な場面
ペアワイズテストが実務で特に効果を発揮する場面を整理します。
| 場面 | パラメータ例 | 削減効果 |
|---|---|---|
| クロスブラウザ・OS テスト | OS × ブラウザ × 画面サイズ | 27→9パターン(67%削減) |
| 設定画面のテスト | テーマ × フォントサイズ × 言語 × 通知設定 | 81→12パターン(85%削減) |
| APIパラメータのテスト | ソート順 × フィルタ条件 × ページサイズ × フォーマット | 大幅削減可能 |
| Playwrightのデバイステスト | デバイス × ネットワーク速度 × ロケール | 27→9パターン(67%削減) |
⚠️ ペアワイズテストでよくある失敗パターン4選
実務でペアワイズテストを適用するときに陥りやすい失敗を紹介します。
① 強い依存関係があるパラメータにペアワイズを適用する
例えば「iOSのみSafariが動作する」という依存関係がある場合、ペアワイズテストが「Windows × Safari」という実際には起こりえない組み合わせを生成してしまいます。パラメータ間に強い依存関係がある場合はデシジョンテーブルの方が適切です。
② 3つ以上のパラメータの相互作用が重要なシステムに適用する
ペアワイズテストは「2パラメータ間のペア」を網羅しますが、「3パラメータが特定の値の組み合わせで発生するバグ」は見逃す可能性があります。安全性が要求されるシステムや3因子以上の相互作用が重要な場合は、3-wise・4-wiseなどより高い網羅度を検討しましょう。
③ ペアワイズテストだけで全テストを代替しようとする
ペアワイズテストは組み合わせテストを効率化する技法であり、単体テスト・同値分割・境界値分析の代わりにはなりません。「組み合わせの網羅」にはペアワイズ、「値の範囲検証」には同値分割・境界値分析というように、目的に応じて技法を使い分けましょう。
④ ツール任せにしてテストケースの内容を確認しない
allpairspy などのツールが生成したテストケースを確認せずにそのまま使ってしまうケースです。不可能な組み合わせ(例:macOS × Internet Explorer)が含まれていないか、重要なペアが抜けていないかを必ず目視確認してから自動テストに組み込みましょう。
FAQ
Q. ペアワイズテストはどんなときに使うべきですか?
パラメータが5個以上あり、全組み合わせのテストが非現実的な場合に使います。OS・ブラウザ・デバイス・言語設定・画面サイズなど、独立したパラメータが多い環境設定系のテストに特に有効です。条件が2〜4個程度でパラメータ間に依存関係がある場合はデシジョンテーブルの方が適しています。
Q. ペアワイズテストとデシジョンテーブルはどう使い分けますか?
デシジョンテーブルは「条件が2〜5個・業務ロジック・条件間に依存関係あり」の場合に使います。ペアワイズテストは「パラメータが5個以上・環境設定・パラメータが独立している」場合に使います。実務では両方を組み合わせることもあり、業務ロジックはデシジョンテーブル、クロス環境テストはペアワイズという使い分けが一般的です。
Q. バグを100%見つけられますか?
いいえ。ペアワイズテストは「全組み合わせテストより効率的に多くのバグを見つける」技法であり、100%の保証はできません。3つ以上のパラメータが特定の値になって初めて発生するバグは見逃す可能性があります。重要性・リスクに応じて全組み合わせテストやより高い因子数のテストと組み合わせることを検討しましょう。
Q. JSTQBでペアワイズテストは出題されますか?
JSTQB Foundation Levelではペアワイズテスト(2因子間網羅)の概念が出題範囲に含まれています。「全組み合わせテストとの違い」「2因子間網羅の意味」「適用場面」を理解しておけば対応できます。上位資格のAdvanced Levelではより詳細な知識が問われます。
📖 関連記事
実務では、クロスブラウザテストの設計に allpairspy でテストケースを生成し、Playwright × pytestの parametrize に渡すワークフローをよく使っています。パラメータの追加・変更がパラメータリストの更新だけで済むため、テスト設計と実装の保守コストを大幅に削減できます。
📋 この記事のまとめ
- ペアワイズテストは「任意の2パラメータのペアが最低1回テストされる」を保証するテスト設計技法
- 3パラメータ×3値=27パターン → 9パターン程度に削減しながらペアの網羅性を維持
- Pythonの
allpairspyでテストケースを自動生成し、parametrizeに渡すと即自動テスト化 - パラメータが独立している・5個以上の場合に特に有効(依存関係がある場合はデシジョンテーブルを検討)
- 3パラメータ以上の相互作用が重要な場合はより高い因子数のテストとの併用を検討
ペアワイズテストは「全部テストしたいけど時間がない」というジレンマを解決する現実的な技法です。まずは allpairspy をインストールして、手元の設定項目やクロス環境テストに適用してみましょう。27パターンが9パターンになる瞬間、テスト設計の見方が変わります。

