こんにちは。よっしーです(^^)
今日は、batsによるシェルスクリプトのテストについてご紹介します。
背景
bashにおけるshUnit2によるシェルスクリプトのテストについて調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
“bats” は、Bashのためのシェルスクリプトテストフレームワークです。Batsは、Bashスクリプトをテストするための手軽で簡潔な方法を提供します。以下に、Batsを使用する基本的な手順と機能の一部を示します。
Batsの基本的な使用法
- Batsのインストール:
まず、Batsをインストールする必要があります。通常、GitHubからソースコードをクローンして、実行可能なファイルを取得します。
git clone https://github.com/bats-core/bats-core.git
cd bats-core
./install.sh /usr/local
- テストスクリプトの作成:
テストしたいBashスクリプトと同じディレクトリに、*_test.sh
という名前のテストスクリプトを作成します。 例:myscript.sh
というBashスクリプトの場合、myscript_test.sh
という名前のテストスクリプトを作成します。 - テストの記述:
テストスクリプト内で、bats
コマンドを使用してテストを記述します。以下は、簡単な例です。
#!/usr/bin/env bats
@test "Addition" {
result=$(echo 2+2 | bc)
[ "$result" -eq 4 ]
}
@test "Subtraction" {
result=$(echo 5-2 | bc)
[ "$result" -eq 3 ]
}
- テストの実行:
テストスクリプトを実行して、Batsがスクリプトの振る舞いをテストすることができます。
bats myscript_test.sh
Batsの主な機能
- テストのグループ化: テストを論理的なグループにまとめて実行できます。
- テストフレームワークの拡張: Batsは、テストフレームワークをカスタマイズおよび拡張するための機能を提供しています。
- 色付きの出力: テスト結果は色付きで表示され、失敗したテストがわかりやすくなります。
- Bashスクリプトのテスト: Batsは、Bashスクリプトをテストするための専用のフレームワークであり、シンプルでありながら強力なテスト機能を提供します。
Batsは、Bashスクリプトの品質を確認し、変更が予想通りに動作するかどうかを確認するために役立ちます。
修正ファイル一覧
modified: local/Dockerfile
new file: local/work/16_bats/16_bats.bats
new file: local/work/16_bats/hello.sh
Dockerfile
@@ -21,3 +21,15 @@ RUN curl -fsSL https://git.io/shellspec | sh -s -- --yes \
# shUnit2
RUN git clone https://github.com/kward/shunit2.git /usr/local/bin/shunit2
+
+# bats
+ARG BATS_VERSION="1.10.0"
+
+# Install bats
+RUN batstmp="$(mktemp -d bats-core-${BATS_VERSION}.XXXX)" \
+ && echo ${batstmp} \
+ && cd ${batstmp} \
+ && curl -SLO https://github.com/bats-core/bats-core/archive/refs/tags/v${BATS_VERSION}.tar.gz \
+ && tar -zxvf v${BATS_VERSION}.tar.gz \
+ && bash bats-core-${BATS_VERSION}/install.sh /usr/local \
+ && rm -rf "${batstmp}"
16_bats/16_bats.bats
#!/usr/bin/env bats
setup() {
load ./hello.sh
}
# テスト関数
@test "test hello" {
output="$(hello ShellSpec)"
[ "$output" == "Hello ShellSpec" ]
}
16_bats/hello.sh
#!/usr/bin/env bash
hello() {
echo "Hello ${1}"
}
動作確認
下記のコマンドを実行します。
make build
make up
make login
cd 16_bats/
chmod +x 16_bats.bats
./16_bats.bats
下記のような出力になっていれば成功です。
解説
16_bats/16_bats.bats
このコードは、Bats(Bashのテストフレームワーク)を使用して、hello.sh
という別のBashスクリプトの動作をテストするためのものです。以下に、コードの各部分の解説を示します:
- Shebang:
#!/usr/bin/env bats
この行は、スクリプトがどの実行可能なプログラムで動作するかを指定しています。/usr/bin/env
を使用することで、環境変数に設定されたPATHからbats
コマンドを検索し、それを使用してスクリプトを実行します。
setup
関数:
setup() {
load ./hello.sh
}
setup
関数は、各テストの前に実行されるコードを提供します。この例では、load
コマンドを使用して、hello.sh
を読み込んでいます。これにより、テスト実行時に hello.sh
の内容が利用可能になります。
- テスト関数:
@test "test hello" {
output="$(hello ShellSpec)"
[ "$output" == "Hello ShellSpec" ]
}
@test
マクロは、Batsにおけるテストの単位を定義します。このテストは “test hello” という名前が付けられています。テスト内のコードは、output
変数に hello.sh
の実行結果を格納し、その後、期待される出力と比較しています。
output="$(hello ShellSpec)"
:hello.sh
を実行し、引数として “ShellSpec” を渡してその結果をoutput
変数に格納しています。[ "$output" == "Hello ShellSpec" ]
:output
の値が “Hello ShellSpec” と等しいかどうかを検証しています。もし等しくない場合、テストは失敗となります。
このコード全体は、Batsを使用して hello.sh
の挙動を確認するためのシンプルなテストスクリプトです。bats
コマンドで実行することで、テストが成功したかどうかが結果として出力されます。
おわりに
今日は、batsによるシェルスクリプトのテストについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント