ユニット試験bashのスクリプト
-
20-09-2019 - |
質問
体制としていますが一部のバスクリプトの走行以外のJavaコードです。私たちはこれからの試験もする可能性のある休憩、bashのスクリプトの破壊を試したいと思います。
問題は難しい試験bashのためのイントロダクションです。
があるので、やベストプラクティスを試験bashのスクリプト?やばい煙を使用bashのスクリプトを探すの代替ソリューションテスト?
解決 2
私は、ディスカッション・グループから以下の回答を得ました
それは(含めるインポートすることが可能です、 何でも)手続き(関数、 何でもそれは、外部からの)という名前です ファイル。これは、書き込みAへの鍵です スクリプトをテスト:あなたは、あなたを破ります 独立した手順にスクリプト それは、両方にインポートすることができます 実行中のスクリプトとあなたのテスト スクリプト、その後、あなたが実行しています スクリプトは、できるだけ簡単なもの。
このメソッドは、スクリプトの依存性注入のようなもので、合理的に聞こえます。 bashのスクリプトを回避し、より多くのテスト可能と少ないあいまいな言語を使用することが好ましいます。
他のヒント
あっ shunit2, は、ルベーユニット試験の枠組みBourneベーシェルのイントロダクションです。んですが、自分のものであります。
質問お問い合わせをいただいてお前:
≪対応Bash試験 Bashの自動検査システム
タップ、試験なプロトコルはシンプルなテキストベースのインターフェイスと実験モジュールテスハーネス≪生活を始めとして、試験用ハーネスのためのPerlが現在の実装はC、C++、Python、PHP、Perl、Java、JavaScript、その他。
なぜあなたはそれがbashのスクリプトをテストするために「ハード」だと言うのですか?
のようなテスト・ラッパーと間違って何ます:
#!/bin/bash
set -e
errors=0
results=$($script_under_test $args<<ENDTSTDATA
# inputs
# go
# here
#
ENDTSTDATA
)
[ "$?" -ne 0 ] || {
echo "Test returned error code $?" 2>&1
let errors+=1
}
echo "$results" | grep -q $expected1 || {
echo "Test Failed. Expected $expected1"
let errors+=1
}
# and so on, et cetera, ad infinitum, ad nauseum
[ "$errors" -gt 0 ] && {
echo "There were $errors errors found"
exit 1
}
私はかなり shell2junit のように、bashスクリプトのテストからのJUnitのような出力を生成するためのユーティリティ。生成されたレポートは、そのようなジェンキンスや竹のJUnitプラグインのような継続的な統合システムによって読み取ることができるので、これは有用である。
shell2junitは shunit2 のような包括的なバッシュスクリプトフレームワークを提供していませんが、、それは認めていませんあなたは、テスト結果の素敵な報告があります。
試 bashtest.で簡単ることをテストするためのイントロダクションです。例えば、 do-some-work.sh
を一部変更configファイルです。例えば、新規追加ライン PASSWORD = 'XXXXX'
めの設定ファイル /etc/my.cfg
.
書きbashコマンドラインによるライントレージエンジンはインデックスを出力します。
ルインストール
pip3 install bashtest
作成の試験はだbashコマンド.
ファイル test-do-some-work.bashtest
:
# run the script
$ ./do-some-work.sh > /dev/null
# testing that the line "PASSWORD = 'XXXXX'" is in the file /etc/my.cfg
$ grep -Fxq "PASSWORD = 'XXXXX'" /etc/my.cfg && echo "YES"
YES
走行試験:
bashtest *.bashtest
多分これが使用され、またはに貢献することができます。
https://thorsteinssonh.github.io/bash_test_tools/する
私は想像TAPプロトコルで結果を書き込むことを目的CIのために良い、とシェル環境が欲しいもののために良いです。私はいくつかは彼らのシェル環境でテストする必要があります主張する人もいるかもしれないので、シェル環境で実行するいくつかのことを想像します。
source "./assert.sh"
local expected actual
expected="Hello"
actual="World!"
assert_eq "$expected" "$actual" "not equivalent!"
# => x Hello == World :: not equivalent!
それが役に立てば幸い!
私は誰 OSHTするについて話したん信じることができません!それはあまりにもスタンドアロンで動作し、それは単純で直接的ですが、(つまり、関連する他の言語ではありません)の両方のTAPとJUnitと互換性があります、それは純粋なシェルです。
テストは、この(スニペットは、プロジェクトのページから取られた)ように見えます
#!/bin/bash
. osht.sh
# Optionally, indicate number of tests to safeguard against abnormal exits
PLAN 13
# Comparing stuff
IS $(whoami) != root
var="foobar"
IS "$var" =~ foo
ISNT "$var" == foo
# test(1)-based tests
OK -f /etc/passwd
NOK -w /etc/passwd
# Running stuff
# Check exit code
RUNS true
NRUNS false
# Check stdio/stdout/stderr
RUNS echo -e 'foo\nbar\nbaz'
GREP bar
OGREP bar
NEGREP . # verify empty
# diff output
DIFF <<EOF
foo
bar
baz
EOF
# TODO and SKIP
TODO RUNS false
SKIP test $(uname -s) == Darwin
簡単な走行ます:
$ bash test.sh
1..13
ok 1 - IS $(whoami) != root
ok 2 - IS "$var" =~ foo
ok 3 - ISNT "$var" == foo
ok 4 - OK -f /etc/passwd
ok 5 - NOK -w /etc/passwd
ok 6 - RUNS true
ok 7 - NRUNS false
ok 8 - RUNS echo -e 'foo\nbar\nbaz'
ok 9 - GREP bar
ok 10 - OGREP bar
ok 11 - NEGREP . # verify empty
ok 12 - DIFF <<EOF
not ok 13 - TODO RUNS false # TODO Test Know to fail
最後のテストでは、「OKでない」として示しているが、それはTODO
だから終了コードは0です。一つは、同様に冗長に設定することができます:
$ OSHT_VERBOSE=1 bash test.sh # Or -v
1..13
# dcsobral \!= root
ok 1 - IS $(whoami) != root
# foobar =\~ foo
ok 2 - IS "$var" =~ foo
# \! foobar == foo
ok 3 - ISNT "$var" == foo
# test -f /etc/passwd
ok 4 - OK -f /etc/passwd
# test \! -w /etc/passwd
ok 5 - NOK -w /etc/passwd
# RUNNING: true
# STATUS: 0
# STDIO <<EOM
# EOM
ok 6 - RUNS true
# RUNNING: false
# STATUS: 1
# STDIO <<EOM
# EOM
ok 7 - NRUNS false
# RUNNING: echo -e foo\\nbar\\nbaz
# STATUS: 0
# STDIO <<EOM
# foo
# bar
# baz
# EOM
ok 8 - RUNS echo -e 'foo\nbar\nbaz'
# grep -q bar
ok 9 - GREP bar
# grep -q bar
ok 10 - OGREP bar
# \! grep -q .
ok 11 - NEGREP . # verify empty
ok 12 - DIFF <<EOF
# RUNNING: false
# STATUS: 1
# STDIO <<EOM
# EOM
not ok 13 - TODO RUNS false # TODO Test Know to fail
.t
拡張子を使用してt
サブディレクトリにそれを置くためにそれを変更し、あなたはそれを実行するためにprove(1)
(Perlのの一部)を使用することができます:
$ prove
t/test.t .. ok
All tests successful.
Files=1, Tests=13, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.11 cusr 0.16 csys = 0.31 CPU)
Result: PASS
OSHT_JUNIT
を設定するか、JUnitの出力を生成する-j
を渡します。 JUnitはまたprove(1)
と組み合わせることができます。
私は自分のファイルを調達し、その後IS
/ OK
を使用してRUN
/ NRUN
とそのネガ、およびスクリプトとのアサーションを実行することで、このライブラリの両方のテスト機能を使用していました。私にとっては、このフレームワークは、少なくともオーバーヘッドのために最も利益を提供しています。
作成した shellspec みたかったので、使いやすい有用なツールです。
で記述による純粋なPOSIXシェルスクリプトこの試験は多くの貝殻のよshunit2.この強力な機能以上のコウモリ/バットがあります。
たとえば、ネストしたブロック、モック/スタブやスキップ済みまたは申請中であり、パラメータ化された試験、主張の行番号、実行した行番号による並列実行、実行をタップする程度php,c#,dにフォーマッタ及び気象CI統合、プロファイラ等
のデモプロジェクトのページです。
私は、ここで紹介するソリューションの多くを試みたが、使用してかさばるし、ハードにそれらのほとんどを見つけたので、私は私自身の小さなテストフレームワークを構築しました:<のhref = "https://github.com/meonlol / T-bashの」REL = "nofollowをnoreferrer"> https://github.com/meonlol/t-bash の
これは、あなたは、単にのJUnitスタイルの基本セットをアサートすると、直接実行することができレポで1つのファイルだけです。
私はいくつかの内部のプロジェクトに専門的にそれを使用して、当社のbashスクリプトは、超安定と回帰耐性にすることができましたしました。
あなたはbash_unitを見てすることがあります:
私が難しかった正当化さbashのための大きなスクリプトが Python のような大きなメリット:
- されていない以外の書き込みをより強固なスクリプトとする機能を取り消しに変更の場合はエラーとなります。
- い利用無名の構文など
if [ x"$foo" = x"$bar"]; then ...
"はがしやすい。 - 簡単に構文解析のオプションと引数の使用
getopt
モジュール(とがしやすくなりモジュールを構文解析の引数の名前を逃しました。 - Pythonできる作品リスト/dicts物ではなく基本的な文字列と配列.
- アクセスへの適切な言語ツールなどの正規表現、データベース(だきパイプのもの
mysql
コマンドbashなアコースティックライブに書コードとします。 - な利用について正しい形の
$*
または"$*"
または"$@"
または$1
または"$1"
, スペースにファイル名ではないが問題などなどがあります。
今でのみ利用bashのための最も簡単なのためのイントロダクションです。