2009-06-15
こんにちは、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でテストの組み合わせを出してみます。お楽しみに!
※記事中に出てくる人名は全てフィクションであり、実在の人物名とは一切関係ありません。
2009-05-14
会社から駅まで2分を切れるようになりました。agoです。
先日社内で行った勉強会の資料を公開したいと思います。
内容は以下の通りです。
- Prototype.jsとjQueryの差異
- jQueryの考え方
- よりよいjQueryの使い方
カヤックでは勉強会に参加経験の豊富な技術者を募集しています!
(2009-05-14 肝心の資料のURLが間違っていました。申し訳ありません)
2009-05-12
前回に引き続き、今回もエクセルネタをお送りします。
若手エクセリスト(エクセルを使う人)のお役に立てれば幸いでございます。
注意:Microsoft Office Excel 2003 での例です。バージョンやOSによっては、操作や表現が異なる場合があります。
1.シートの一覧を活用する
画面仕様書だったり、テスト項目書だったりをエクセルで書くとき、画面や機能ごとにシートを分けていくといつの間にかとんでもないシート数になることがあります。
そんな時に目当てのシートを素早く開くためには、シートの一覧を利用すると便利です。
出し方は、左下の左右向き三角(シート表示領域のスクロールボタン)が並んでる領域で右クリック。
すると、画像のようなシートの一覧が表示され、スクロールしていくよりも断然素早く選択、表示することができます。
なお、シートが15枚を超える場合は「シートの選択」という項目が追加されます。
それをクリックすると全シート一覧の小窓が表示されて同じように選択、表示できるので、シート一覧が長くなって画面からはみ出るということはありません。ご安心を。

2.条件付き書式を活用する
チェックシート等で○×を付けていく際、○⇒緑×⇒赤のようにセルに色をつけると視認性が高まるので気に入ってます。
最初に一個セルを用意しておいてコピペでもいいのですが、条件式書式を設定しておくと決まった文字を入力するだけでセルの背景色を変える、なんてことができます。
- 対象の列を選択
- メニューの「書式」「条件付き書式」をクリック
- 「セルの値が」「次の値に等しい」を選び、右のテキストボックスに対象の文字列を入れる
- 「書式」ボタンを押し、フォントや背景色等を設定する
これで、設定した文字列にマッチする入力がされた場合に、設定した書式が適用されるようになります。
なお、「追加>>」のボタンを押すことで、最大3つの書式まで増やすことが出来ますので、「○⇒緑」「×⇒赤」という設定もへっちゃらのへーです。
(2009-06-15追記:Office 2007では、3個以上設定できるそうです。うらやましい)
ちなみに僕は変換するのが面倒なので、oとx(半角のオーとエックス)にそれぞれ緑、赤を指定してます。
3.条件付き書式をさらに活用する
先ほどのステップ3番目で
「セルの値が」「次の値に等しい」を選び、右のテキストボックスに対象の文字列を入れる
としていますが、ここを変えることでもっと柔軟なマッチのさせ方ができます。
複数のマッチ条件に対応する
「数式が」を選び、テキストボックスには
=OR(A1="o",A1="ok",A1="O",A1="OK",A1="おk")
と、OR関数で文字列を複数設定しておきます。
すると、上の例で言えば「o」でも「ok」でも「O」でも「OK」でも「おk」でも、設定した書式が適用されるようになります。全角でも安心。
部分一致に対応する
「数式が」を選び、テキストボックスには
=COUNTIF(A1,"o*")
と、COUNTIF関数で文字列を複数設定しておきます。
すると、上の例でいうと「oで始まる文字列」が入力されていると、設定した書式が適用されます。
"*「*」*" で「鍵括弧のある文字列」とか、">128" で「128よりも大きい数値」とか、いろんなパターンに使えます。
OR関数と組み合わせて、
=OR(COUNTIF(A1,"*o"),COUNTIF(A1,"O*"))
という設定もできます。楽しみは無限大!
条件付き書式の注意点として、たくさん設定するとその分ファイルサイズが大きくなってアワワワになるので、それほど頻繁に使わないという書式は設定しないようにしましょう。
2009-05-11
スカイダイビングしてきました。agoです。
ちょっと気になったのでいくつかのアニメーションライブラリのFPSを調べてみました。
jQuery
jQuery.fx.custom内でsetInterval(fn, 13);と定義されていました(4064行目)
1000 / 13で大体77FPSのようです。
script.aculo.us
effects.jsのEffect.ScopedQueue.add内のsetInterval(fn, 15);で定義されていました(201行目)
1000 / 15で大体66FPSのようです。
JSTweener
31行目のframeRateを使用しているようです。
初期値は60でした。(setIntervalに直すと1000 / 60で16程度)
どれも結構高いですね。
処理落ちしても大丈夫な作りにはなっていますが、逆に処理落ちが前提の作りともいえるかもしれません。
また、上記のライブラリではJSTweener以外は設定値が埋め込まれており、簡単には変更できなくなっていました。
変更できないかと思って調べたんですが、ちょっと残念な結果でした。
2009-05-08
こんにちは。カヤックモバイル$でコンチとかコンチとかポケットフレンズ コンチを作ってるアラガです。
symfony1.0で大量のレコードに対して1レコードずつ処理をしていくバッチを走らせたところメモリリークしてどうしても途中で処理が終了してしまいました。 調べたところ、既に弊社のsyojiが経験済みでした。(PHPの循環参照ではまった)
が、僕の場合どうしても、このままなんとかしたかったのでなんとかしました。
phpで同様の状況に陥った時に、もっといい方法があれば大募集です。
BEFORE
〜前略〜
$records = BigTablePeer::doSelect(new Criteria());
foreach ($records as $record) {
$subc = new Criteria();
$subdata = SubTablePeer::doSelectOne($subc->add($record->getId()));
// 処理色々
$subdata->save();
$record->save();
}
これだと、数千件でmemoryエラーになってしまうのでファイルを二つに分割;
AFTERE
command.php
〜前略〜
$sub_command = dirname(__file__).DIRECTORY_SEPARATOR.'sub_command.php'
$point = 0;
$limit = 200;
do {
$result = exec("php ".$sub_command." ".$point." ".$limit);
list($total, $rest, $point) = split(",", $result);
} while(0 < $rest);
sub_command.php
〜前略〜
$total = BigTablePeer::doCount(new Criteria());
$c = new Criteria();
$records = BigTablePeer::doSelect($c->setLimit($argv[2])->setOffset($argv[1]));
foreach ($records as $record) {
$subc = new Criteria();
$subdata = SubTablePeer::doSelectOne($subc->add($record->getId()));
// 処理色々
$subdata->save();
$record->save();
}
$next = $argv[1] + $argv[2];
echo ($total).",".($total - $next).",".$next."\n";
このようにスクリプトを分割して少数ずつ外部スクリプトとして実行すれば、この手の問題は回避できます。
美しくはないけど。。。


