組み合わせの抽出に便利なPICT・前編

こんにちは、kondoです。カラオケ、漫画喫茶、バッティングセンターと、一人遊びが充実してきました。

テストエンジニアらしくテストの話も書けよとプレッシャーをかけられたので、今回はテストする値の組み合わせを算出するのに便利なツールをご紹介します。

PICTとは

PICT(Pairwise Independent Combinatorial Testing tool)とは、とっても単純に言うと組み合わせを自動で生成してくれるツールです。

Microsoft社が開発し、実際にMicrosoft社でもテストに使われているそうです。

こちらのサイトからダウンロードできますので、まずはインストールしてみましょう。

Pairwise Testing(Available Toolsからダウンロードできます)

ダウンロードしたらダブルクリックで簡単に展開されます。PATHを通しておくと後で楽ちんですよ(筆者の場合はC:\Program Files\PICT\)

また、gihyo.jp様で組み合わせテストやPICTについて詳しく解説された記事が掲載されていますので、そちらもご覧になることをオススメします。

特集:組み合わせテストをオールペア法でスピーディに!|gihyo.jp … 技術評論社

動かしてみる

まずは使い方を見てみるために、簡単なところでツイスターゲームの手足と色の組み合わせを出してみましょう。

テキストファイルに「[項目名]: 値, 値, 値」という項目を書いて保存します。 日本語が含まれる際は文字コードをEUCにしないと化けるので気をつけてください。

sample_1.txt

どこを: 右手, 左手, 右足, 左足
何色に: 赤, 黄, 緑, 青

そしてコマンドプロンプトからおもむろに以下のコマンドをたたきます。

sample_1.txtが上記のファイル名

1>sample_1_result.txtは結果を保存するファイル名(省略すると成功時にそのまま垂れ流しで表示されます)

2>sample_1_error.txtはエラー時の出力を保存するファイル名です(省略するとエラー時にそのまま垂れ流しで表示されます)

pict sample_1.txt 1>sample_1_result.txt 2>sample_1_error.txt

出力されたsample_1_result.txtを開いてみると

sample_1_result.txt

どこを   何色に
右足  黄
右足  緑
右手  赤
右手  緑
左足  青
左足  黄
左手  緑
左足  赤
右手  黄
右足  赤
右手  青
左手  赤
左手  青
右足  青
左足  緑
左手  黄

おおー。見事にツイスターゲームの手足と色の組み合わせが表示されました。

結果のパターンは文字コードをShift-JISにしてからExcel等で開くと、並び替え等編集しやすいです。

ここで、次世代のツイスターゲームとして、色が6色に増えたものがあるとします。

その組み合わせを出す場合、先ほどのsample_1.txtの方を書き換えます。

sample_2.txt

どこを: 右手, 左手, 右足, 左足
何色に: 赤, 黄, 緑, 青, 紫, 茶

そして実行、出てきた結果は。。。

pict sample_2.txt 1>sample_2_result.txt 2>sample_2_error.txt

sample_2_result.txt

どこを   何色に
右足  青
左足  青
右手  緑
左手  赤
左足  紫
右足  茶
左手  紫
左足  赤
右手  黄
右手  茶
右足  赤
右手  青
右足  黄
左手  青
右足  紫
右手  赤
左足  黄
左手  黄
右手  紫
左手  緑
右足  緑
左手  茶
左足  茶
左足  緑

色を6色に増やすことができました。組み合わせは4*6で24個。バッチリです。

こうやって、値や項目を調整しつつ、組み合わせを作っていくことになります。

絞り込んでみる

ただ全パターン出すだけではなく、条件によって組み合わせを絞り込むことも出来ますが、絞込みの方法には「条件付き制約」「無条件制約」があります。

制約条件はSQLと似ており、「=, <>, <, <=, >, >=」「NOT, AND, OR」「IN」「LIKE *,?」といった比較演算が使えます。

A = B           AとBは等しい
A <> B          AとBは等しくない
A < B           AはBよりも小さい
A <= B          AはB以下
A > B           AはBよりも大きい
A >= B          AはB以上
NOT(式)            式の真偽を反対にする
(式) AND (式) どちらも真の場合に真とする
(式) OR (式)  どちらか片方でも真の場合に真とする
A IN (B, C, D)  AがB,C,Dのいずれかと等しければ真
A LIKE "hoge*"  Aがhogeで始まる文字列であれば真(*はワイルドカード)
A LIKE "hoge?"  Aがhogeで始まる5文字の文字列であれば真(?は任意の1文字)

比較対象の値は以下の様に表現します。

項目名   [どこを]
文字列   "右足"
数値  123

ここでは以下の問題に答えるために、制約条件を用いてみたいと思います。

問題1:一条, 二ノ宮, 三島, 四元, 五木の五人で競走をしました。1着と2着の組み合わせを全通り挙げてください。

問題2:問題1の中で、四元と五木は仲良しでいつも一緒なので、四元が1着の時は五木が2着、五木が1着の時は四元が2着になるとします。その場合の1着と2着の組み合わせを全通り挙げてください。

無条件制約

問題1のポイントは、全員一人ずつなので「1着と2着が同じではいけない」ですね。このようなパターンでは、「無条件制約」を用いると便利です。

「無条件制約」は、項目の後に制約文を記述します。

sample_3_1.txt

1着: 一条, 二ノ宮, 三島, 四元, 五木
2着: 一条, 二ノ宮, 三島, 四元, 五木

####################
# 無条件制約
# 
# 1着と2着は別の人
[1着] <> [2着];

さあレースのスタートです。

pict sample_3_1.txt 1>sample_3_1_result.txt 2>sample_3_1_error.txt

答えはこちら。全部で5*4の20通りになるはずです。

sample_3_1_result.txt

1着  2着
三島  五木
三島  二ノ宮
二ノ宮   五木
五木  二ノ宮
二ノ宮   三島
四元  三島
五木  三島
一条  三島
一条  五木
四元  五木
五木  一条
四元  一条
三島  四元
三島  一条
五木  四元
一条  二ノ宮
四元  二ノ宮
二ノ宮   四元
一条  四元
二ノ宮   一条
条件付き制約

問題2のように「○○は(○○の場合は)△△になる」という場合は、「条件付き制約」の出番です。

条件付き制約は、おなじみのif文を用います。

if 条件
    then 結果;

こんな感じで。

sample_3_2.txt

1着: 一条, 二ノ宮, 三島, 四元, 五木
2着: 一条, 二ノ宮, 三島, 四元, 五木

####################
# 無条件制約
# 
# 1着と2着は別の人
[1着] <> [2着];

####################
# 条件付き制約
# 
# 四元が1着の場合は五木が2着
if [1着] = "四元"
    then [2着] = "五木";
# 五木が1着の場合は四元が2着
if [1着] = "五木"
    then [2着] = "四元";

さて実行。

pict sample_3_2.txt 1>sample_3_2_result.txt 2>sample_3_2_error.txt

結果は以下のとおり。四元が1着+五木が1着+他の三人が1着で3*4通り=全部で14通りになります。

sample_3_2_result.txt

1着  2着
一条  五木
二ノ宮   五木
三島  五木
一条  四元
二ノ宮   三島
五木  四元
二ノ宮   四元
三島  一条
三島  四元
三島  二ノ宮
一条  二ノ宮
四元  五木
二ノ宮   一条
一条  三島

さーて、次回のkondoさんは

次回は実際のサイトをモデルにして、PICTでテストの組み合わせを出してみます。お楽しみに!

※記事中に出てくる人名は全てフィクションであり、実在の人物名とは一切関係ありません。