ペアワイズテストとは?テストケースを大幅削減する手法+allpairspy×pytest実装

テスト自動化

ペアワイズテストとは、複数のパラメータの組み合わせを「任意の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つのパラメータを持つシステムをテストする場合を考えます。

📋 テストパラメータ

パラメータ値①値②値③
OSWindowsmacOSLinux
ブラウザChromeFirefoxSafari
言語設定日本語英語韓国語

全組み合わせ:3 × 3 × 3 = 27パターン → ペアワイズ:9パターン程度に削減

ペアワイズ法で生成された9パターン

#OSブラウザ言語設定
1WindowsChrome日本語
2WindowsFirefox英語
3WindowsSafari韓国語
4macOSChrome英語
5macOSFirefox韓国語
6macOSSafari日本語
7LinuxChrome韓国語
8LinuxFirefox日本語
9LinuxSafari英語

この9パターンで「OS×ブラウザ」「OS×言語設定」「ブラウザ×言語設定」のすべての組み合わせが最低1回カバーされます。27パターンから67%削減しながら、2パラメータ間の網羅性は完全に保たれています。

💡 ポイント:例えば「macOS × Firefox」という組み合わせがテストケース5で確認でき、「Firefox × 韓国語」もテストケース5でカバーされています。ペアワイズ法は各ペアが最低1回テストされるよう効率的にテストケースを配置します。

デシジョンテーブルとの違いとは?

同じ「組み合わせテスト」系の技法でも、デシジョンテーブルとペアワイズテストは使い分けるべき場面が明確に異なります

比較項目デシジョンテーブルペアワイズテスト
条件の数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パターンに削減!
💡 実務Tip:パラメータの値が増えても 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 ===========================
💡 実務Tipallpairspy で生成したケースをそのまま 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パターンになる瞬間、テスト設計の見方が変わります。

タイトルとURLをコピーしました