こんにちは、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でテストの組み合わせを出してみます。お楽しみに!
※記事中に出てくる人名は全てフィクションであり、実在の人物名とは一切関係ありません。