ファイルから対話型 Bash Shell の標準入力に入力する
対話型の Bash Shell ツールをテストしたときの覚書です。
従来、対話型Shellのテストはいちいち手入力して出力を確認していましたが、ファイルからの標準入力に置換えられることがわかった、というお話です。
背景:Bash Shell ツールのテストの難しさ
普段、Bash Shell のツールを使うことがちょくちょくありますが、テストはお粗末になりがちでした。
中でも、対話型の Shell ツールに関しては、都度手入力し、出力確認をしていたことで、テストの網羅度が非常に低くなっていました。
Shell ツール(例)
単純に入力を求めて、入力されたものを表示するだけのShellです。
$ bash sample_tool.bash
整数を入力してください >
1
1が入力されました
$ bash sample_tool.bash
整数を入力してください >
1.1
整数以外が入力されました:1.1
コード
#!/bin/bash
if [ $# -gt 0 ]; then
echo "引数は必要ありません"
exit 1
fi
echo "整数を入力してください >"
read INPUT
expr $INPUT + 1 > /dev/null 2>&1
INPUT_CHECKER=$?
if [ $INPUT_CHECKER -gt 1 ]; then
echo 整数以外が入力されました:${INPUT}
exit 1
fi
echo ${INPUT}が入力されました
テスト内容(例)
# | 入力 | 期待値 | 説明 |
---|---|---|---|
正常系1 | 1 | 1が入力されました | 実行モードで1を入力する |
正常系2 | 100 | 100が入力されました | 実行モードで100を入力する |
異常系1 | a | 整数以外が入力されました | 実行モードでaを入力する |
異常系2 | 1.1 | 整数以外が入力されました | 実行モードで1.1を入力する |
何が問題か
- インタラクティブでのテストを前提としているため、テストの自動化などができない
- 毎回入力して、アウトプットを確認するなどの手間がひどい
対話型のShellのテスト方法
標準入力を置き換えるという方法で、いちいち対話入力して確認する必要がなくなりました。
具体的な方法は以下の通り。
Linux では標準入力は置き換えられる
[command] < [textファイル]
で、textファイルの内容で標準入力を置き換えられます。
これによって、入力を自動化し、自動テストなどに利用できることがわかりました。
実際の例
こんな感じの入力用ファイルを用意しておきます。
1
後は上記の通り、これを入力に置き換えるだけ。
$ bash sample_tool.bash < input.txt
整数を入力してください >
1が入力されました
確かに期待したとおり、標準入力が置き換わっています。
複数回の対話を行う場合
入力用のファイルを複数行にすると、複数回の対話に対応可能です。
ツール(例)
複数回の入力を求めて、それをそれぞれ出力させるだけのものです。
$ bash sample_tool.bash
整数1を入力してください >
3
3が入力されました
整数2を入力してください >
u
整数以外が入力されました:u
コード
#!/bin/bash
main(){
if [ $# -gt 0 ]; then
echo "引数は必要ありません"
exit 1
fi
echo "整数1を入力してください >"
read INPUT_1
numberChecker $INPUT_1
echo ${INPUT_1}が入力されました
echo ""
echo "整数2を入力してください >"
read INPUT_2
numberChecker $INPUT_2
echo ${INPUT_2}が入力されました
echo ""
}
numberChecker () {
expr $1 + 1 > /dev/null 2>&1
INPUT_CHECKER=$?
if [ $INPUT_CHECKER -gt 1 ]; then
echo 整数以外が入力されました:$1
exit 1
fi
}
main
入力置き換え(例)
入力用のファイルを用意しておきます。複数回の入力の対応のために、複数行に分けます。
1
2
置き換えを行うと、たしかに入力が複数回行われていることがわかりました。
$ bash sample_tool.bash < input.txt
整数1を入力してください >
1が入力されました
整数2を入力してください >
2が入力されました
更にこれを活かすには~テスト用Shellの作成~
テスト用のShellを書いたりしたのですが、それはまた別の機会に。