ペアワイズテスト(オールペア法)は、たくさんの条件の組み合わせを、「どの2つの条件を取り出しても、値の組がすべて1回は出てくる」ように選んで、テストの件数を減らす方法です。 不具合の多くは1つか2つの条件の組み合わせで起きる、という考え方に基づいています。

この記事の例では、注文画面の5つの条件で 108通りある組み合わせを、12件にしました。

方法 件数 2つの組の網羅
全部の組み合わせ 108件 67 / 67
ペアワイズ(allpairspy) 12件 67 / 67(全部入っている)

確認環境:Python 3.11・allpairspy 2.5.1(Linux)で生成し、網羅しているかを自分で書いたスクリプトで確かめました(確認日 2026年10月12日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ペアワイズテストのやり方|108通りを12件にする手順」

1. 条件(因子)と値(水準)を書き出す

まず、テストしたい条件と、それぞれが取る値を表にします。 ペアワイズテストでは、条件を「因子」、値を「水準」と呼ぶこともあります。

条件(因子) 値(水準) 数
支払い カード、コンビニ、代引き 3
会員 会員、ゲスト 2
配送 通常、お急ぎ、店舗受取 3
端末 PC、スマホ、タブレット 3
クーポン あり、なし 2

全部の組み合わせは 3 × 2 × 3 × 3 × 2 = 108通りです。

値は「同じ扱いになるもの」をまとめて代表を1つにすると、件数がさらに減ります。たとえば「カード」の中で VISA と Mastercard の処理が同じなら、カード1つで代表させます(同値分割)。値のまとめ方は、関連記事「同値分割・境界値分析|テストケース表とpytestコード例で解説」で扱っています。

2. ペアワイズの組み合わせを作る

手で作るのは難しいので、ツールで作ります。 ここでは Python の allpairspy を使いました。

from allpairspy import AllPairs

params = {
    "支払い": ["カード", "コンビニ", "代引き"],
    "会員": ["会員", "ゲスト"],
    "配送": ["通常", "お急ぎ", "店舗受取"],
    "端末": ["PC", "スマホ", "タブレット"],
    "クーポン": ["あり", "なし"],
}
for i, row in enumerate(AllPairs(list(params.values())), 1):
    print(i, " / ".join(row))

出力された12件です(上から順に No.1〜12)。

支払い 会員 配送 端末 クーポン
カード 会員 通常 PC あり
コンビニ ゲスト お急ぎ スマホ あり
代引き ゲスト 店舗受取 タブレット なし
代引き 会員 お急ぎ タブレット あり
コンビニ 会員 店舗受取 PC なし
カード ゲスト 通常 スマホ なし
カード ゲスト 店舗受取 スマホ あり
代引き ゲスト 通常 PC あり
カード 会員 お急ぎ PC なし
コンビニ 会員 通常 タブレット あり
カード 会員 通常 タブレット あり
代引き 会員 通常 スマホ あり

3. 本当に全部の組が入っているか確かめる

ツールの出力を信じきらず、「すべての2つの組が入っているか」を確かめます。 5つの条件から2つを選ぶ組み合わせは10通りあり、その値の組は全部で67個です。次のスクリプトで数えると、12件で 67 / 67 でした。

from itertools import combinations, product

def missing_pairs(values, rows):
    need, got = set(), set()
    for idx in combinations(range(len(values)), 2):
        for vals in product(*[values[i] for i in idx]):
            need.add((idx, vals))
        for r in rows:
            got.add((idx, tuple(r[i] for i in idx)))
    return need - got     # 空なら、すべての組が入っている

values = list(params.values())
rows = [list(r) for r in AllPairs(values)]
print(len(rows), missing_pairs(values, rows))   # 12 set()

4. 制約(ありえない組み合わせ)を入れる

実際の画面では、「代引きは店舗受取と組み合わせられない」のような、ありえない組み合わせがあります。 そのままだと、No.3 の「代引き × 店舗受取」のように、テストできない行ができます。allpairspy では filter_func で除けます。

def is_valid(row):
    # 代引きは店舗受取と組み合わせられない
    if len(row) > 2 and row[0] == "代引き" and row[2] == "店舗受取":
        return False
    return True

rows2 = [list(r) for r in AllPairs(values, filter_func=is_valid)]

制約を入れて作り直すと、12件のまま「代引き × 店舗受取」の行は無くなりました。ところが、網羅を確かめると、組が1つ漏れていました。

件数 網羅(作れない組を除く) 足りない組
制約あり 12件 65 / 66 支払い「コンビニ」× 端末「タブレット」

制約を入れると、ツールによっては組が漏れることがあります。 3の確認スクリプトで足りない組を見つけ、その組を含む行(コンビニ/会員/通常/タブレット/なし)を1件足すと、13件で 66 / 66 になりました。「生成して終わり」にせず、確認までを手順にしておくのが大事なところです。

PICT のモデルの書き方

Microsoft の PICT は、ペアワイズテストでよく使われるコマンドラインのツールです。 条件と値をテキストファイル(モデル)に書きます。

支払い:   カード, コンビニ, 代引き
会員:     会員, ゲスト
配送:     通常, お急ぎ, 店舗受取
端末:     PC, スマホ, タブレット
クーポン: あり, なし

IF [支払い] = "代引き" THEN [配送] <> "店舗受取";
pict model.txt          # ペアワイズ(2つの組)
pict model.txt /o:3     # 3つの組をすべて網羅

PICT のドキュメントでは、組み合わせの次数は /o:N で指定し、既定は2、/o:3 で「すべての3つの組」を網羅すると説明されています。

向いている場面・向かない場面

向いている 向かない
条件が多く、全部の組み合わせを試せない(環境・設定・入力の種類) 特定の組み合わせが重要(料金の計算ルール、権限の判定)
条件どうしの関係が弱い 条件の順番や状態の移り変わりが重要
ブラウザ×OS×端末のような環境のテスト 3つ以上の条件がそろったときだけ起きる不具合を見つけたい

料金や権限のように「この組み合わせなら必ずこうなる」が決まっているものは、デシジョンテーブルで全部の条件を書き出すほうが確実です。ペアワイズで減らしたテストに、重要な組み合わせを手で足すのが現実的な使い方です。デシジョンテーブルは、関連記事「デシジョンテーブルの書き方と例5題|条件の簡単化とテストケースの作り方」で扱っています。

直交表との違い

ペアワイズ(オールペア法) 直交表
網羅するもの すべての2つの組が 1回以上 出る すべての2つの組が 同じ回数 出る
件数 少なくしやすい 表の形に合わせるので増えることがある
条件の値の数がばらばら 扱いやすい 合わせるのに工夫が要る
作り方 ツール(PICT・allpairspy など) 決まった表(L8・L9 など)に当てはめる

よくある質問

Q. 何件まで減るかの目安はありますか。 A. 値の数が一番多い条件と、2番目に多い条件の値の数をかけた数が、最低限の件数です。この例では 3 × 3 = 9 件が下限で、ツールは12件を出しました。

Q. 期待結果はどう書きますか。 A. ペアワイズで作れるのは「入力の組み合わせ」までです。各行で何が起きれば正しいか(期待結果)は、仕様から1件ずつ書きます。テスト仕様書の書き方は、関連記事「テスト仕様書の書き方|テストケースの記入例と観点の洗い出し方」で扱っています。

Q. 出力が毎回同じになりません。 A. allpairspy は、同じ入力で2回実行して同じ結果でした。ただし、条件や値の並び順を変えると結果も変わります。テスト仕様書に貼るときは、生成した結果をファイルに保存し、その版を使います。

Q. 生成AIに組み合わせを作らせてもいいですか。 A. 作らせることはできますが、網羅しているかは3の確認スクリプトで必ず数えます。生成AIでテストケースを作る方法は、関連記事「生成AIでテストケースを作るプロンプト集|同値分割・境界値対応」で扱っています。

まとめ

  • ペアワイズテストは、どの2つの条件を取っても、値の組が1回は出るように選ぶ方法
  • 例では 108通り → 12件、2つの組の網羅は 67 / 67
  • 制約を入れると組が1つ漏れた。生成後に 網羅の確認スクリプトを流し、足りない行を足す
  • PICT は モデルファイルに条件・値・制約を書き、/o:3 で3つの組まで網羅
  • 料金・権限など重要な組み合わせは、デシジョンテーブルで別に押さえる

参考・出典

確認日はいずれも 2026年10月12日です。

  • Microsoft PICT ドキュメント(モデルの書き方・制約・/o オプション):https://github.com/microsoft/pict/blob/main/doc/pict.md
  • allpairspy 2.5.1(PyPI):https://pypi.org/project/allpairspy/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ペアワイズテストのやり方|108通りを12件にする手順」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?