この記事の目的
この記事では、
Bashの自動テストツール(bats)環境の構築
を目的としています。
本題
★batsとは
Bash Automated Testing Systemです。
GitHubのURL↓
github.com
batsは、TAP(後述します)に準拠したbash用のテストフレームワークです。
batsによって、実装したbashが期待通りに動作することを簡単に検証することができます。
batsのテストケースは、bashスクリプトと、batsによって提供される構文で実装します。
こんな感じです(GitHubから拝借しています)。
#!/usr/bin/env bats
@test "addition using bc" {
result="$(echo 2+2 | bc)"
[ "$result" -eq 4 ]
}
@test "addition using dc" {
result="$(echo 2 2+p | dc)"
[ "$result" -eq 4 ]
}
上記の例だと、2件のテストケースが定義されています。
resultに格納された値が4になることの検証を行っています。
★環境
以下の環境で作業を行いました。
Virtual Boxで用意したUbuntu(18.04)
Visual Studio Code(1.24.1)
bats(VS Codeの拡張機能 v.0.1.2)
bats(batsコマンドv.0.4.0)
GNU Bash(4.4.19)
★batsのVSCode拡張機能のインストール
Visual Studio Codeの拡張機能でbatsを検索し、インストールします。

★batsコマンドのインストール
batsを実行するためのコマンドをインストールします。
ubuntuのターミナルで以下のコマンドを実行します。
※管理者パスワードが要求されます。
sudo apt install bats
★動作確認用のbatsファイルとプログラムの用意
batsのコードを実装する環境と、実行する環境が整いました。
引き続き、batsのテストコードと、テスト対象のコードを実装していきます。
テスト対象のコードは以下の通りです。
ファイル名は、Program001.shとします。
#!/bin/bash echo "hello" exit 0
単純明快w
続いて、テストコードを実装します。
ファイル名は、Program001.batsとします。
#!/usr/bin/env bats
@test "test name"{
Run ./Program001.sh #<-テスト対象のスクリプトを実行します。
echo {$lines[0]} #<- 失敗時の確認用に標準出力の1行目の文字を出力します。
[ "${lines[0]}"="hello" ] #<- 標準出力の1行目の文字の検証を行います。
[ "$status" -eq 0 ] #<- 終了コードが0であることの検証を行います。
}
各ファイルは以下のように配置しました。

これで、準備が完了しました。
★テスト実行
早速テストを実行します。
VSCodeのエクスプローラで、対象のファイルが格納されたパスでターミナルを開きます。

batsコマンドに、対象のテストファイルを渡して実行します。

実行結果↓

なお、$statsuの期待値を9にして、わざと失敗させた場合は以下の通りの出力となります。

わかりやすい!
★実行がうまくいかないとき
自分がbats環境を構築していてはまった点を忘備録として残しておきます。
上記の通りにスクリプトを準備しても、テストが成功しないことがありました。

何が悪いのかわからないので、テストコードを変更し、
検証に失敗しているlines変数に何が入っているか確認してみました。
実行してみます。

許可がない・・・だと・・・
いろいろ調べてみると、ファイルの実行権限が内容だということがわかりました。
参考)http://nasunu-i.b.la9.jp/LinuxBeginner/ExecPermission.htm
おもむろにllコマンドでファイルの権限を調べてみると
権限設定は以下のようになっていました。

rwだけ・・・
ファイルのプロパティで見ても、読み書きだけ権限になっています。

確かに権限がなかったです。
結局この問題は、上記画像の「プログラムとして実行可能」チェックをつけるか、
「chmod u+x Program001.shコマンドを実行することで解決します。
↓コマンドを実行し、実行可能権限を付与したところ。

無事権限が付与され、実行可能を意味する「x」が付きました。
ファイル名の色も変わっています(´▽`)
再度テストを実行すると・・・
無事成功させることができた!(∩´∀`)∩ワーイ
