明日から使える PICT 入門ガイド
目的
- 明日から即実戦投入できるように、Microsoft 製 OSS PICT の概要と使い方を集中解説します。
- 本稿を読めば「モデルファイル作成 → pict 実行 → シート共有」までひと通り流せます。
1. PICT とは?
- Pairwise Independent Combinatorial Testing の略。
- 指定した t-wise(デフォルト 2‑wise)で 全組合せを最小行数に圧縮してくれる CLI ツール。
- 制約(IF〜THEN など)、重み付け、事前シード固定など現場要件に便利な機能が充実。
- 追い付きやすい: モデルファイルはシンプルなテキスト、実行は 1 コマンド、生成は数 ms〜数百 ms。
参考 : Microsoft/PICT GitHub レポジトリ, “PICT User Guide” (PDF)
2. インストール & セットアップ
2.1 CLI 本体
# macOS / Linux (Homebrew)
brew install pict
# Windows
choco install pict # or GitHub Releases の zip を展開
# Python 包 (サーバー用途)
pip install pypict # pict バイナリ同梱 wheel
2.2 VS Code 拡張(GUI 補助)
- Marketplace で "VSCode PICT" を検索→インストール。
-
.pict
ファイルのシンタックスハイライトとモデル検証が可能。
3. モデルファイルの作り方
# login.pict
OS: Windows, macOS, Linux
Browser: Chrome, Firefox, Edge
Lang: JP, EN
# 無効組合せ除外
IF [OS] = "macOS" THEN [Browser] <> "Edge";
-
書式 :
パラメータ名: 値1, 値2, ...
を 1 行ずつ。 - コメントは
#
。 - 制約文は SQL ライクで読みやすい。
n‑wise 組合せ数を手計算してみる
以下の 3 パラメータを例に 2‑wise と 3‑wise の理論組合せ数を求めてみます。
Parameter | 値数 |
---|---|
OS | 3 (Windows / macOS / Linux) |
Browser | 3 (Chrome / Firefox / Edge) |
Language | 2 (JP / EN) |
2‑wise(ペアワイズ)
-
ペアの取り出し方は
3C2 = 3
通り。 -
各ペアの値直積:
- OS × Browser → 3 × 3 = 9
- OS × Language → 3 × 2 = 6
- Browser × Language → 3 × 2 = 6
-
合計 9 + 6 + 6 = 21 ペア
PICT の出力は 21 ペアを およそ 6 行 でカバーします。
3‑wise
- 取り出しは
3C3 = 1
通り(3 パラメータ全取り)。 - 値直積は 3 × 3 × 2 = 18 通り。
PICT ならこの 18 通りを 12 行前後 に圧縮可能です(モデル順やシードで前後)。
「n」を上げると理論ペア数は指数的に増えるため、実務では 基本 2‑wise+ハイリスク部のみ 3‑wise という運用が多いです。
4. テストケース生成フロー
# 4.1 ペアワイズ生成
pict login.pict > cases.tsv
# 4.2 3‑wise(/o:3) + 統計表示
pict login.pict /o:3 /s
-
/s
で 理論ペア数と生成行数を事前チェック。 - 出力は タブ区切り TSV。スプレッドシートにドラッグ&ドロップで貼り付け可。
5. Python からの自動活用
5.1 subprocess
で直接呼び出し
import csv, subprocess, pathlib
# --- パス設定 ---
model = pathlib.Path('login.pict')
output = pathlib.Path('cases.tsv')
# --- pict 実行 ---
subprocess.run(['pict', str(model)], check=True, stdout=output.open('w'))
# --- 読み込み&pytest 展開 ---
cases = list(csv.DictReader(output.open(), delimiter='\t'))
def idfn(row):
return f"{row['OS']}-{row['Browser']}-{row['Lang']}"
import pytest
@pytest.mark.parametrize('row', cases, ids=idfn)
def test_login(row):
# row は辞書型
...
5.2 pypict
ラッパー使用
from pypict import pict
model_text = """OS: Windows, macOS; Browser: Chrome, Firefox"""
for row in pict(model_text):
print(row) # => ['Windows', 'Chrome'] など
-
CI/CD に組み込むなら
subprocess
で TSV をアーティファクト化するのが簡単。 - pytest のパラメータ化と相性抜群 → テスト関数は 1 つで済み、ケースは増殖しても保守コスト増えない。
6. 何が効率化できるか?
- 組合せ爆発の手計算から解放:6 パラメータ・各 4 値なら理論 2‑wise ペア = 180。pict は 10 行前後 で網羅。
- 仕様変更耐性:モデルファイルを書き換えて再生成するだけ。手修正ゼロ。
-
再現性確保:
/r:固定シード
で毎回同じ行順 → 差分レビューがクリーン。 -
テスト失敗パターン固定:シード行 (
/e:seed.tsv
) で不安定ケースを必ず含める。
7. ベストプラクティス & Tips
- 値は同値分割後の代表値に絞る → pict 生成行を最小化。
- 業務ルールはすべて制約に落とす → 出力後の手動フィルタリングは禁忌。
- 3‑wise 以上はリスク基準で:全パラメータを 3‑wise にすると行数が急増。高頻度障害領域だけ別モデルに分割。
- モデル名 = 機能名 で管理 → Git に置いて PR レビューで仕様も共有。
8. よくあるハマりポイント
症状 | 原因例 | 解決策 |
---|---|---|
行数が思ったより多い | ネガティブ値 ~ を多用 → 対象値扱い |
値を具体化、制約で除外 |
無効組合せが混ざる | 制約不足 or 誤記 |
/s 出力を読み、IF 文追加 |
TSV が壊れる | モデルにタブ文字混入 | 値区切りを , か ; に統一 |
9. 参考リンク
- Microsoft GitHub – PICT: https://github.com/microsoft/pict
- Jacek Czerwonka, “Pairwise Testing in Practice,” IEEE Software, 2009.
- Blog: “Pairwise Testing – Why & How” by Hexawise.
おわりに
pict は「少ないテストで広いバグ網を張る」ための武器。モデルファイルさえ書けば明日からでも回せます。まずは 2‑3 パラメータで動かして行数の圧縮率を体感してください。