PICTというツール(3)

こんにちは、森永です。
今回は PICT が生成したテストケースが、3つのパラメータを網羅できているかを検証します。

組み合わせ候補の作成

3つのパラメータの組み合わせ候補は、
(候補1×候補2×候補3)+(候補1×候補2×候補4)+(候補1×候補3×候補4)+(候補2×候補3×候補4)
ですから、(28×11×9)+(28×11×9)+(28×9×9)+(11×9×9)=8,703通りとなります。
前回の2項目の組み合わせ候補はExcelで作成したのですが、今回はさすがに手作業は面倒なのでツールを作成しました。

#!/bin/bash

# パラメータリストの設定
ITEMS_1=rail1.lst        # 山手線のパラメータリスト(28駅)
ITEMS_2=rail2.lst        # 東上線のパラメータリスト(11駅)
ITEMS_3=rail3.lst        # 有楽町線のパラメータリスト(9駅)
ITEMS_4=rail4.lst        # 丸の内線のパラメータリスト(9駅)

# 3項組合せ
# 候補1×候補2×候補3
cat ${ITEMS_1} | while read LINE_1
do
	cat ${ITEMS_2} | while read LINE_2
	do
		cat ${ITEMS_3} | while read LINE_3
		do
			echo ${LINE_1} ${LINE_2} ${LINE_3} |
			awk '{
				printf("%s\t%s\t%s\n", $1,$2,$3);
			}'
		done
	done
done

# 候補1×候補2×候補4
cat ${ITEMS_1} | while read LINE_1
do
	cat ${ITEMS_2} | while read LINE_2
	do
		cat ${ITEMS_4} | while read LINE_4
		do
			echo ${LINE_1} ${LINE_2} ${LINE_4} |
			awk '{
				printf("%s\t%s\t%s\n", $1,$2,$3);
			}'
		done
	done
done

# 候補1×候補3×候補4
cat ${ITEMS_1} | while read LINE_1
do
	cat ${ITEMS_3} | while read LINE_3
	do
		cat ${ITEMS_4} | while read LINE_4
		do
			echo ${LINE_1} ${LINE_3} ${LINE_4} |
			awk '{
				printf("%s\t%s\t%s\n", $1,$2,$3);
			}'
		done
	done
done

# 候補2×候補3×候補4
cat ${ITEMS_2} | while read LINE_2
do
	cat ${ITEMS_3} | while read LINE_3
	do
		cat ${ITEMS_4} | while read LINE_4
		do
			echo ${LINE_2} ${LINE_3} ${LINE_4} |
			awk '{
				printf("%s\t%s\t%s\n", $1,$2,$3);
			}'
		done
	done
done

これを実行します。

ubuntu:~$ ls -1
crpairs.sh
parameters.txt
rail1.lst
rail2.lst
rail3.lst
rail4.lst
verify.sh
ubuntu.txt
windows.txt

ubuntu:~$ bash crpairs.sh > all_3pairs.txt
ubuntu:~$ wc -l all_3pairs.txt
8703  all_3pairs.txt

ubuntu:~$ head all_3pairs.txt
山手線:東京	東上線:池袋	有楽町:池袋
山手線:東京	東上線:池袋	有楽町:要町
山手線:東京	東上線:池袋	有楽町:千川
山手線:東京	東上線:池袋	有楽町:小竹向原
山手線:東京	東上線:池袋	有楽町:氷川台
山手線:東京	東上線:池袋	有楽町:平和台
山手線:東京	東上線:池袋	有楽町:地下鉄赤塚
山手線:東京	東上線:池袋	有楽町:地下鉄成増
山手線:東京	東上線:池袋	有楽町:和光市
山手線:東京	東上線:北池袋	有楽町:池袋
ubuntu:~$

これで、8,703通りの組み合わせができました。
「そんなに大量のテストなんかできねーよ!」なんて、ここでは言いっこなしですよ。

テストケースの検証

PICTは標準では2つのパラメータの組み合わせを網羅しますが、/oオプションでパラメータ数を変更することができます。
下の実行結果は、①3パラメータでの組み合わせを指定してPICTを実行、②生成されたテストケースをUTF-8に変更する、③生成されたテストケースの行数を確認する、④テストケースの先頭数行を確認する、という手順で実行しています。

ubuntu:~$ "$PICT_PATH/pict.exe" parameters.txt /o:3 > ubuntu_3pairs.txt  …①
ubuntu:~$ nkf -E -w ubuntu_3pairs.txt > ubuntu_3pairs_utf8.txt  …②
ubuntu:~$ wc -l ubuntu_3pairs*  …③
2944  ubuntu_3pairs.txt
2944  ubuntu_3pairs_utf8.txt
5888  合計

ubuntu:~$ head ubuntu_3pairs_utf8.txt  …④
山手線	接続線1	接続線2	接続線3
山手線:駒込	東上線:池袋	有楽町:地下鉄成増	丸の内:新大塚
山手線:神田	東上線:下板橋	有楽町:地下鉄赤塚	丸の内:新大塚
山手線:西日暮里	東上線:上板橋	有楽町:氷川台	丸の内:淡路町
山手線:新橋	東上線:和光市	有楽町:要町	丸の内:大手町
山手線:東京	東上線:中板橋	有楽町:池袋	丸の内:本郷三丁目
山手線:有楽町	東上線:東武練馬	有楽町:小竹向原	丸の内:御茶ノ水
山手線:神田	東上線:和光市	有楽町:池袋	丸の内:後楽園
山手線:浜松町	東上線:池袋	有楽町:小竹向原	丸の内:大手町
山手線:御徒町	東上線:下板橋	有楽町:池袋	丸の内:新大塚
ubuntu:~$

果たして、生成結果には全ての組み合わせ候補が網羅されているのでしょうか?
前回作成した verify.sh というツールを少し変更して、3パラメータを検証できるようにしました。
リスト中のハイライト表示されている行が、変更した箇所です。

#!/bin/bash

###############################################################################
# シェル内関数定義
###############################################################################
helpMessage() {
	echo ""
	echo "名称: verify.sh"
	echo "形式: verify.sh [-r resultfile -p candidatefile | [-h | --help]]"
	echo "概要: パラメタの組合せ候補が、pictが生成した組合せ結果に含まれる"
	echo "       かを検査します。組合せ結果に含まれない候補を、標準出力に出"
	echo "       力します。"
	echo "引数: -r resultfile	組合せ結果ファイルを指定します。"
	echo "       -p candidatefile	組合せ候補ファイルを指定します。"
	echo "       -h | --help	このヘルプを表示します。"
	echo ""
	exit 0
}

usageMessage() {
	echo "usage: verify.sh [-r resultfile -p candidatefile | [-h | --help]]" 1>&2
	exit 1
}

nofileMessage() {
	echo "$@: file not found." 1>&2
	exit 2
}

###############################################################################
# 引数処理
###############################################################################

# ヘルプ表示処理
for argv in $@
do
	if [ "$argv" = "-h" -o "$argv" = "--help" ]; then
		helpMessage
		exit $?
	fi
done

# 引数の数をチェック
if [ $# -lt 4 ]; then
	usageMessage
	exit $?
fi

# パラメタの初期化
unset RESULT_FILE
unset ALL_PAIRS

# パラメタの取得
while getopts r:p: argv
do
	case "$argv" in
	"r")
		RESULT_FILE="$OPTARG"
		;;
	"p")
		ALL_PAIRS="$OPTARG"
		;;
	esac
done

# パラメタの長さチェック 
if [ ${#RESULT_FILE} -le 0 ]; then
	usageMessage
	exit $?
fi
if [ ${#ALL_PAIRS} -le 0 ]; then
	usageMessage
	exit $?
fi

# ファイルの存在チェック
if [ ! -f "$RESULT_FILE" ]; then
	nofileMessage "$RESULT_FILE"
	exit ?
fi
if [ ! -f "$ALL_PAIRS" ]; then
	nofileMessage "$ALL_PAIRS"
	exit ?
fi

###############################################################################
# メイン処理
###############################################################################

# 組合せ候補をファイルから1行ずつ読み出す
cat $ALL_PAIRS | while read pair_line
do
	# 組合せを分解する
	PAIR_MEMBERS=(`echo $pair_line | sed -e 's/\t/ /g'`)
	
	# PICTの出力結果から検査対象になる全行を読み出す
	res_line=`grep ${PAIR_MEMBERS[0]} $RESULT_FILE`
	RES_MEMBERS=(`echo $res_line | sed -e 's/\t/ /g'`)

	# PICT出力結果に組合せ候補が含まれるか検査する
	found1=0
	found2=0
	for res_mem in ${RES_MEMBERS[@]}
	do
		if [ "$res_mem" = ${PAIR_MEMBERS[1]} ]; then
			found1=1
		fi
		if [ "$res_mem" = ${PAIR_MEMBERS[2]} ]; then
			found2=1
		fi
		
		if [ $found1 -eq 1  -a  $found2 -eq 1 ]; then
			break;
		fi
	done

	# 検査結果の出力
	if [ $found1 -eq 0  -o  $found2 -eq 0 ]; then
		echo "${pair_line}: not found."
	fi
done

そして、実行します。

ubuntu:~$ bash verify.sh -r ubuntu_3pairs_utf8.txt -p all_3pairs.txt
ubuntu:~$

テストケースの中には、全ての組み合わせが網羅されていることが確認できました。

試しに、前回の2パラメータ用のテストケースに、今回の3パラメータが網羅されているかを確認してみました。

ubuntu:~$ bash verify.sh -r ubuntu.txt -p all_3pairs.txt
ubuntu:~$

なんと!2パラメータ用のテストケースも、3パラメータの組み合わせが全部網羅されています。
これがテストケースに因るものなのかどうかは、今回の検証では分かりませんでした。
次回以降にもう少し検証したいと思います。

それでは。