1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ファイルから対話型 Bash Shell の標準入力に入力する

Last updated at Posted at 2019-09-17

ファイルから対話型 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
コード
Code
#!/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ファイルの内容で標準入力を置き換えられます。
これによって、入力を自動化し、自動テストなどに利用できることがわかりました。

実際の例

こんな感じの入力用ファイルを用意しておきます。

input.txt
1

後は上記の通り、これを入力に置き換えるだけ。

標準入力の置き換え
$ bash sample_tool.bash < input.txt
整数を入力してください >
1が入力されました

確かに期待したとおり、標準入力が置き換わっています。

複数回の対話を行う場合

入力用のファイルを複数行にすると、複数回の対話に対応可能です。

ツール(例)

複数回の入力を求めて、それをそれぞれ出力させるだけのものです。

実行例(対話)
$ bash sample_tool.bash
整数1を入力してください >
3
3が入力されました

整数2を入力してください >
u
整数以外が入力されました:u
コード
Code
#!/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                      

入力置き換え(例)

入力用のファイルを用意しておきます。複数回の入力の対応のために、複数行に分けます。

input.txt
1
2

置き換えを行うと、たしかに入力が複数回行われていることがわかりました。

実行例(入力置き換え)
$ bash sample_tool.bash < input.txt
整数1を入力してください >
1が入力されました

整数2を入力してください >
2が入力されました

更にこれを活かすには~テスト用Shellの作成~

テスト用のShellを書いたりしたのですが、それはまた別の機会に。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?