シェルスクリプトでパラメタ総当りテスト

2017年6月27日

この記事では、コマンドライン引数でパラメタを指定するテストプログラムがあるときに、
パラメタの様々な組み合わせについて、テストプログラムを実行する、シェルスクリプトを作成します。

バージョン1

設定:

  • 2つのパラメタ(Param1 と Param2)を引数に取る、do_test という名前のテストプログラムがあるとします。
  • Param1 は、 A~D のいずれかの値を取ります。
  • Param2 は、 a~d のいずれかの値を取ります。
  • これらの組み合わせ 16 パターンについて、テストを実行するシェルスクリプトを作成します。
  • Param1 が D で、Param2 が c のときの処理にバグがあって、テストが失敗するものとします。

単純に 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 のときのエラーが報告されています。

バージョン2

バグを修正して、修正確認をしたいとします。
最終的には全パターンテストするにしても、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

バージョン3

ところで、このスクリプトでは、引数無しで実行すると、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

ランダム順にすることで、エラーの発覚が早くなりました。

Tags

About Author

koto

Leave a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Recent Comments

Social Media