シェルスクリプト」カテゴリーアーカイブ

Bashで書いたシンプルなテストツールBaut

この記事は【2017年10月17日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

最近シェルスクリプトでちょっとしたテストコードを書く機会が多いのでテストを支援するツールを書いてみました。シェルスクリプトのスキル不足な面もあり、色々と調べながら試行錯誤しながら書くことで良い学びの機会となった。

テストツールはBaut(Bash Unit test Tool)という名前でBash上で動作します。Bats[1]https://github.com/sstephenson/batsという便利なテストツールがあるけれど、Batsとは実行のアプローチは異なります。インターフェースは似ています、というか影響を受けています。

Bautの特徴は以下のような感じです。

  • テストはただのBashスクリプトである。DSLも使用していないので、使い慣れたエディタで特別なモードも必要なく、すぐにテストを書き始められる。
  • テストレポートなどカスタマイズしやすい。標準で2、3用意している。
  • テストの出力が分かりやすい方かも。echoprintfで実行した結果が素直にレポートの結果で確認できる。
  • Helperなど組み込みやすい。

テストツールとしては斬新で真新しい機能はないですが、ちょっとした機能確認に役立つかもというレベルのものです。まだ見直しも含め変更の可能性がありますが、とりあえず動くのでgithubにあげてます。

テストのサンプルは以下のようになります。

見ての通り、Bashスクリプトそのものです。

実行は以下。

さらに詳細な情報は以下から参照できます。

Baut’s Documentation

もし役に立つことがあれば。

BASHで__FILE__や__DIR__みたいなもの

この記事は【2017年8月24日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

シェルスクリプト(BASH限定ですが)、他の言語でもよく見られる__FILE__や__DIR__みたいなことをするにはどのようにすれば良いか、と考えてみた結果以下のようになった。小生のシェルスクリプトスキルが高くないので何ともだが上手く動いているようだ。もっと良いやり方があるかもしれない。クロスシェル対応できたらと思ったが、他のシェルスクリプトのスキルがほぼないので今後の課題とする。。

それぞれのsource先でBASH_SOURCE変数を参照する方法でも良いが、シンボリックリンクの場合に絶対パスを取得できないので、一枚関数をかましている。resolve_linkの方法は参考リンクを参照させていただいた。readlink-fオプションが使えない場合でも動く。

以下のようなファイル構成で試してみる。環境はMax OS X。

foo.sh

hello.sh

barの実行。__FILE__でちゃんとbarの参照先foo.shの絶対パスが表示されているようだ。

foo.shの実行。

参考リンク

  • http://qiita.com/yudoufu/items/48cb6fb71e5b498b2532
  • http://qiita.com/edvakf@github/items/b8400f7dfe9210aadddd

BatsでシェルスクリプトやCLIプログラムのテストをする

この記事は【2016年5月8日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

恥ずかしながら今まではシェルスクリプトで書いたプログラムのテストをするときは、echoprint-xオプションを駆使して行なっていたのですが、Batsというテストフレームワークがあることを知り早速使ってみました。

2017.9.7修正 コード他

Bats概要

Bashで動作するソフトウェアのテストフレームワークでBashで書かれています。テスト対象は、BashスクリプトだけでなくUnix上で動作するプログラムなら何でも可能なようです。というのはソースを見ると分かりますが、BatsはBashから任意のプログラムを実行しその結果の正当性(終了ステータスや出力)を検証できるような作りになっています。

早速インストールしてテストコードを書いてみます。MacでHomeBrewを使っている場合は、以下でインストール可能です。

実際にテストコードが動作する様子を見てみます。

シンタックス

テストコードのシンタックスは以下のようなになります。body部分はBashスクリプトとして実行されます。

setup、teardown

XUnitフレームワークのように、各テストブロック実行前後にsetup、teardownで定義された関数を実行することができます。

run

テストブロックの中では、runという関数が使えます。runは、任意のスクリプトやコマンド、関数を指定することができます。終了ステータスは$status、標準出力・標準エラー出力の結果は$outputという変数で参照できます。また、$linesという変数には改行区切りで配列参照が可能です。

skip

skipを使うと後続のコマンドを実行せずに次のテストに移ります。

実行すると以下のようになります。

load

load関数を実行すると、任意のスクリプトをsourceコマンドで読み込みます。拡張子は、.bashで指定する必要があります。

どのように実行されている?

test.batsのコードは、実際には以下のようなシェルスクリプトに変換されて実行されているようです。$TMPDIRを見ると実際のスクリプトを確認することができます。

ドキュメントにもあるように、.batsファイルのスクリプトはn+1回評価されます(n+1回、sourceコマンドで読み込みされます)。まず、上記の変換したファイルがsourceコマンドで読み込まれ、続いてbats_test_functionで実行するテスト関数が収集されます。この時、テスト関数は実行されません。続いて、bats_test_functionで登録された各テスト関数がsourceコマンドで読み込みされlibexec/bats-exec-testで実行されます。関数ごとにbats-exec-testコマンドを実行しますので、ある関数で設定した変数は、別の関数では参照できませんし、あるテストの設定が他のテストに影響しません。グルーバルな変数を使いたい場合は、@test{}の外に書く必要があります。

実際に確認してみます。echo "hoge"は、3回評価されるはずです。

これを実行すると、以下のような出力が得られます。テスト関数+1回分評価されていることが確認できました。

その他

何故か以下のようにダブルブラケットを連続して書いた場合、最後の式以外の結果が打倒でないにも関わらずテストをパスしてしまいました。。原因は追えていないので何とも言えませんが、とりあえず&&で対処してみました。
(2017.9.7 修正  “”の記述が不要でした) 2017.10.2

参考リンク

  • https://github.com/sstephenson/bats
  • http://qiita.com/5t111111/items/c4a382c7dd896c353d03
入門bash 第3版
入門bash 第3版

posted with amazlet at 16.05.07
Cameron Newham Bill Rosenblatt
オライリージャパン
売り上げランキング: 119,456

関連

Batsに影響を受けているのでインタフェースは似ていますが、実行アプローチは異なるテストツールを書きました。BAsh Unit test ToolでBaut(バウト)です。