bash入門:batsによるシェルスクリプトのテスト

スポンサーリンク
bash入門:batsによるシェルスクリプトのテスト ノウハウ
bash入門:batsによるシェルスクリプトのテスト
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、batsによるシェルスクリプトのテストについてご紹介します。

スポンサーリンク

背景

bashにおけるshUnit2によるシェルスクリプトのテストについて調査する機会があったので、そのときの内容を備忘として残しました。

この記事のソースは下記のサイトにアップしています。

実行環境について

実行環境は下記の記事を参考にお願いします。

概要

“bats” は、Bashのためのシェルスクリプトテストフレームワークです。Batsは、Bashスクリプトをテストするための手軽で簡潔な方法を提供します。以下に、Batsを使用する基本的な手順と機能の一部を示します。

Batsの基本的な使用法

  1. Batsのインストール:
    まず、Batsをインストールする必要があります。通常、GitHubからソースコードをクローンして、実行可能なファイルを取得します。
   git clone https://github.com/bats-core/bats-core.git
   cd bats-core
   ./install.sh /usr/local
  1. テストスクリプトの作成:
    テストしたいBashスクリプトと同じディレクトリに、*_test.sh という名前のテストスクリプトを作成します。 例:myscript.sh というBashスクリプトの場合、myscript_test.sh という名前のテストスクリプトを作成します。
  2. テストの記述:
    テストスクリプト内で、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 ]
   }
  1. テストの実行:
    テストスクリプトを実行して、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スクリプトの動作をテストするためのものです。以下に、コードの各部分の解説を示します:

  1. Shebang:
   #!/usr/bin/env bats

この行は、スクリプトがどの実行可能なプログラムで動作するかを指定しています。/usr/bin/env を使用することで、環境変数に設定されたPATHからbatsコマンドを検索し、それを使用してスクリプトを実行します。

  1. setup 関数:
   setup() {
     load ./hello.sh
   }

setup 関数は、各テストの前に実行されるコードを提供します。この例では、load コマンドを使用して、hello.sh を読み込んでいます。これにより、テスト実行時に hello.sh の内容が利用可能になります。

  1. テスト関数:
   @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によるシェルスクリプトのテストについてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました