- 検証・テスト
ペアワイズテストのやり方|108通りを12件にする手順
ペアワイズテスト(オールペア法)は、たくさんの条件の組み合わせを、「どの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期連続の黒字決算。