「ユニットテスト」のシェルスクリプトの考え方は、制御された環境でスクリプトを実行するラッパースクリプトを用意することです。つまり、実行したくない実際のコマンドを「模擬する」関数を定義することです(例えば、ssh() { }
)。
これにより、あなたが興味を持っている他のプロセスを気にせずに、興味のあるインタラクションをテストすることができます。これはまだよく設計されたbashコードに非常に依存していますが、少なくとも理論的には可能です。
デモ:
$ cat /tmp/grep.sh
#!/bin/bash
# Simple program that relies on grep
echo -e "This is a test\nThis line doesn't match." | grep test
単位のテスター:
$ /tmp/grep.sh
This is a test
をしかし、unittestのスクリプト内から実行する場合:今
$ cat /tmp/unittest.sh
#!/bin/bash
grep() {
echo "Mock GREP result"
}
. "[email protected]"
我々は直接grep.sh
を実行する場合は、それが期待通りに検索grep
は関数によって嘲笑されます:
$ /tmp/unittest.sh /tmp/grep.sh
Mock GREP result
検証しようとしている動作をテストすることができます。
これには、同じシェル(.
コマンド)から実行する必要があるなど、いくつかの制限事項があります。つまり、スクリプトが別のスクリプトを呼び出すと、再び実際のコマンドが呼び出されます。
代わりに、ユニットテストディレクトリに一連のスクリプトを定義することもできます。
$ ls /usr/local/unitbin
grep
ssh
svn
は次に例えば、ユニット・テスト・スクリプトは、スクリプトが実行されますから、PATHを変更する必要があり:
$ cat /tmp/unittest.sh
#!/bin/bash
PATH=/usr/local/unitbin:$PATH "[email protected]"
これは、順番に他のスクリプトを呼び出すスクリプトのために働く必要があります。
これらの例のいずれも、私が言ったように、少しばかげている、と彼らは価値があるならよりも潜在的に多くの問題。私は間違いなく、この経路を検討する前に、この質問に対する他の答えを見ていきます。しかし、単体テストにしたいが、サンドボックスで安全に実行できないbashコードがあれば、これらのオプションの1つが役に立つかもしれません。
メンテナンスが難しい理由は、基本機能を中心に「すべてやる」ラッパーです。私の意見では、特定のユースケースを中心に(例外処理とjunitテストを含む)完全なアプリケーションをコーディングするほうがいいでしょうし、特定の保守タスクのための限定されたシェルスクリプトを保持することもできます。 –
/bin/shは_lot_を実行できます。設定を変数の単純なリストとして保持できる場合は、 "source"/""と呼ぶことができます。 XMLファイルがある場合は、XSLTスクリプトを記述して変数のリストを作成します。 –