2016.05.08この記事は約5分で読めます。恥ずかしながら今まではシェルスクリプトで書いたプログラムのテストをするときは、echoやprint、-xオプションを駆使して行なっていたのですが、Batsというテストフレームワークがあることを知り早速使ってみました。参考リンク関連Bats概要Bashで動作するソフトウェアのテストフレームワークでBashで書かれています。テスト対象は、BashスクリプトだけでなくUnix上で動作するプログラムなら何でも可能なようです。いうのはソースを見ると分かりますが、BatsはBashから任意のプログラムを実行しその結果の正当性(終了ステータスや出力)を検証できるような作りになっています。インストールしてテストコードを書いてみます。MacでHomeBrewを使っている場合は、以下でインストール可能です。bats実際にテストコードが動作する様子を見てみます。failuresシンタックステストコードのシンタックスは以下のようなになります。body部分はBashスクリプトとして実行されます。"message"の前後にはスペースが必要}setup、teardownXUnitフレームワークのように、各テストブロック実行前後にsetup、teardownで定義された関数を実行することができます。./tmp}runテストブロックの中では、runという関数が使えます。runは、任意のスクリプトやコマンド、関数を指定することができます。終了ステータスは$status、標準出力・標準エラー出力の結果は$outputという変数で参照できます。$linesという変数には改行区切りで配列参照が可能です。]}skipskipを使うと後続のコマンドを実行せずに次のテストに移ります。{true}実行すると以下のようになります。skippedloadload関数を実行すると、任意のスクリプトをsourceコマンドで読み込みます。拡張子は、.bashで指定する必要があります。"hoge"}どのように実行されている?test.batsのコードは、実際には以下のようなシェルスクリプトに変換されて実行されているようです。$TMPDIRを見ると実際のスクリプトを確認することができます。test_Whey_say_function_is_passed_-27hello-27-2c_it_should_output_-27hello-27ドキュメントにもあるように、.batsファイルのスクリプトはn+1回評価されます(n+1回、sourceコマンドで読み込みされます)。上記の変換したファイルがsourceコマンドで読み込まれ、続いてbats_test_functionで実行するテスト関数が収集されます。この時、テスト関数は実行されません。続いて、bats_test_functionで登録された各テスト関数がsourceコマンドで読み込みされlibexec/bats-exec-testで実行されます。関数ごとにbats-exec-testコマンドを実行しますので、ある関数で設定した変数は、別の関数では参照できませんし、あるテストの設定が他のテストに影響しません。グルーバルな変数を使いたい場合は、@test{}の外に書く必要があります。実際に確認してみます。"hoge"は、3回評価されるはずです。{true}これを実行すると、以下のような出力が得られます。テスト関数+1回分評価されていることが確認できました。以下のようにダブルブラケットを連続して書いた場合、最後の式以外の結果が打倒でないにも関わらずテストをパスしてしまいました。原因は追えていないので何とも言えませんが、とりあえず&&で対処してみました。119,456Amazon.co.jpで詳細を見る関連Batsに影響を受けているのでインタフェースは似ていますが、実行アプローチは異なるテストツールを書きました。ToolでBaut(バウト)です。コピーbyebyehaikikyouをフォローするbyebyehaikikyouデバッグライフ関連記事シェルスクリプトBashで書いたシンプルなテストツールBaut最近シェルスクリプトでちょっとしたテストコードを書く機会が多いのでテストを支援するツールを書いてみました。シェルスクリプトのスキル不足な面もあり、色々と調べながら試行錯誤しながら書くことで良い学びの機会となった。テストツールはBaut(Ba...シェルスクリプトBASHで__FILE__や__DIR__みたいなものシェルスクリプト(BASH限定ですが)、他の言語でもよく見られる__FILE__や__DIR__みたいなことをするにはどのようにすれば良いか、と考えてみた結果以下のようになった。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。名前:moritetuITエンジニア地方でITエンジニアをしています。Webやスマフォアプリ、Hadoopなどのビッグデータに関するシステムに関わり、現在は企画開発の業務をしています。(必須)サイトタイトルとURLをコピーしました。