このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
この記事では、コマンドライン引数でパラメタを指定するテストプログラムがあるときに、
パラメタの様々な組み合わせについて、テストプログラムを実行する、シェルスクリプトを作成します。
設定:
単純に for を2重にループさせ、テストプログラムを実行することにします。
シェルスクリプト (ver1.sh):
#!/bin/bash -eu
# テストプログラム
function do_test()
{
echo "do_test" $@
# 特定の組み合わせでバグがあり、テストfail する
if [ "$1" = "D" -a "$2" = "c" ] ; then
false
fi
}
# 取りうるパラメタの範囲
Param1_Values="A B C D"
Param2_Values="a b c d"
# for で総当り
for Param1 in ${Param1_Values} ; do
for Param2 in ${Param2_Values} ; do
if ! do_test ${Param1} ${Param2} ; then
echo "Error:" Param1=${Param1} Param2=${Param2}
fi
done
done
実行結果:
$ ./ver1.sh
do_test A a
do_test A b
do_test A c
do_test A d
do_test B a
do_test B b
do_test B c
do_test B d
do_test C a
do_test C b
do_test C c
do_test C d
do_test D a
do_test D b
do_test D c
Error: Param1=D Param2=c
do_test D d
全パターンについて do_test を実行しており、Param1=D Param2=c のときのエラーが報告されています。
バグを修正して、修正確認をしたいとします。
最終的には全パターンテストするにしても、Param1=D and/or Param2=c のケースは優先的にテストしておきたいです。
シェルスクリプトの引数で、パラメタの範囲を限定できるようにします。
シェルスクリプト (ver2.sh):
#!/bin/bash -eu
# テストプログラム
function do_test()
{
echo "do_test" $@
}
# 取りうるパラメタの範囲
Param1_Values="A B C D"
Param2_Values="a b c d"
# Param1_Values, Param2_Values を変更できるようにする
for arg in "$@" ; do
case "${arg}" in
*=*)
var_name=${arg%=*}
values=${arg#*=}
eval "${var_name}_Values=\"${values}\""
;;
esac
done
# for で総当り
for Param1 in ${Param1_Values} ; do
for Param2 in ${Param2_Values} ; do
if ! do_test ${Param1} ${Param2} ; then
echo "Error:" Param1=${Param1} Param2=${Param2}
fi
done
done
実行結果:
$ ./ver2.sh Param1=D Param2=c
do_test D c
$ ./ver2.sh Param1=D
do_test D a
do_test D b
do_test D c
do_test D d
$ ./ver2.sh Param2=c
do_test A c
do_test B c
do_test C c
do_test D c
ところで、このスクリプトでは、引数無しで実行すると、Param1=A のケースが先に重点的にテストされ、Param1=D のケースは最後にテストされます。
Param2 と無関係に、Param1=D の処理にバグが有るような場合、もっと偏りなくテストしたほうが、早くバグに当たりやすくなります。
実行順をランダムにするオプション –shuffle を追加します。
シェルスクリプト (ver3.sh):
#!/bin/bash -eu
# テストプログラム
function do_test()
{
echo "do_test" $@
# Param2 にかかわらず、Param1=D のとき テストfail する
if [ "$1" = "D" ] ; then
false
fi
}
# 取りうるパラメタの範囲
Param1_Values="A B C D"
Param2_Values="a b c d"
UseShuffle=0
for arg in "$@" ; do
case "${arg}" in
*=*)
var_name=${arg%=*}
values=${arg#*=}
eval "${var_name}_Values=\"${values}\""
;;
--shuffle)
UseShuffle=1
;;
esac
done
TestCases="$(
for Param1 in ${Param1_Values} ; do
for Param2 in ${Param2_Values} ; do
echo Param1=${Param1} Param2=${Param2}
done
done
)"
if [ $UseShuffle = 1 ] ; then
TestCases="$(echo "${TestCases}" | shuf)"
fi
echo "${TestCases}" |\
while read TestCase ; do
eval ${TestCase}
if ! do_test ${Param1} ${Param2} ; then
echo "Error:" Param1=${Param1} Param2=${Param2}
fi
done
実行結果:
$ ./ver3.sh
do_test A a
do_test A b
do_test A c
do_test A d
do_test B a
do_test B b
do_test B c
do_test B d
do_test C a
do_test C b
do_test C c
do_test C d
do_test D a
Error: Param1=D Param2=a
do_test D b
Error: Param1=D Param2=b
do_test D c
Error: Param1=D Param2=c
do_test D d
Error: Param1=D Param2=d
$ ./ver3.sh --shuffle
do_test B a
do_test B c
do_test A c
do_test D d
Error: Param1=D Param2=d
do_test D a
Error: Param1=D Param2=a
do_test A d
do_test D c
Error: Param1=D Param2=c
do_test B b
do_test D b
Error: Param1=D Param2=b
do_test A b
do_test B d
do_test C a
do_test A a
do_test C d
do_test C c
do_test C b
ランダム順にすることで、エラーの発覚が早くなりました。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....