私のプログラムをテストするためにシェルスクリプトを書こうとしています。これについていくつかの基本的な質問があります。
目的:シェルスクリプトは特定のプログラムをテストし、そのプログラムがテストに合格するか失敗するかを確認できる必要があります。
私のアプローチ:ここでは、2つのプログラム、つまりプログラムの入力とそれに応じたプログラムの出力を処理する必要があります。そのために、mytest.inやmytest.outなどのI / Oテストファイルがあり、それをテストに使用しているとします。
Q:私の障害は - mytest.inをプログラム(program.cなど)にどのように渡しますか?つまり、この場合、入力リダイレクトをどのように実行できますか?これが完了したら、どのように出力を取得し、それをmytest.outの出力と比較しますか?
メモ:
->ファイルに提供された入力は、プログラムがコマンドラインを介してパラメータを取得できないと仮定し、stdinを介して提供されます。
-> 次のようにシェルスクリプトを使用するとします。
./testscript tests folder program
これを証明できる例を挙げればいいと思います。
答え1
プログラムに特定の入力があります。
- コマンドライン(
"${inputArgs[@]}"
) - 標準入力
- (+可能:暗黙的な入力ファイル、システム状態)
そしていくつかの出力
- 返品状況(
$?
) - 標準出力
- 標準エラー
- (+可能:暗黙的な出力ファイル、システム状態の変更)
括弧で囲まれた入力と出力は、体系的にテストするのが困難です。これを回避できる場合は、テストスイートは基本的に次のことを行う必要があります(文字通りではありません)。
./program "${inputArgs[@]}" < stdin.txt > stdout.txt 2>stderr.txt; status=$?
if [ "$status" -eq "$expectedStatus" ] && cmp stdout.txt expectedStdout.txt && cmp stderr.txt expectedStderr.txt; then
echo OK
else
[ ! $status -eq $expectedStatus ] && echo "Status $status != $expectedSattus"
diff stdout.txt expectedStdout.txt
diff stderr.txt expectedStderr.txt
fi