このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
この記事では、コマンドライン引数でパラメタを指定するテストプログラムがあるときに、
パラメタの様々な組み合わせについて、テストプログラムを実行する、シェルスクリプトを作成します。
設定:
単純に 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
ランダム順にすることで、エラーの発覚が早くなりました。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...