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

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

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

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

スポンサーリンク

背景

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

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

実行環境について

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

概要

shellspecは、シェルスクリプトのユニットテストやBDD(Behavior-Driven Development)スタイルのテストをサポートするためのシェルフレームワークです。shellspecを使用することで、シェルスクリプトに対して効果的で簡潔なテストを記述し、コードの品質を向上させることができます。

以下は、shellspecの基本的な特徴と使い方の例です。

  1. インストール: shellspecは、通常、開発者が手動でインストールする必要があります。GitHubからリポジトリをクローンしてセットアップする方法があります。
   git clone https://github.com/shellspec/shellspec
   cd shellspec
   sudo ./bin/shellspec --setup

または、公式のインストールガイドに従ってインストールすることもできます。

  1. テストスクリプトの作成: shellspecでは、テストスクリプトは通常_spec.shという名前で保存されます。例えば、myscript.shに対するテストスクリプトはmyscript_spec.shとなります。
   # myscript_spec.sh

   Describe 'myscript.sh'
     Include ./myscript.sh

     It 'returns 0 exit status'
       When call my_function
       The status should be success
     End
   End

この例では、myscript.sh内のmy_functionが0の終了ステータスを返すことをテストしています。

  1. テストの実行: shellspecのテストスクリプトは、単一のファイルやディレクトリ全体を対象に実行することができます。
   ./bin/shellspec myscript_spec.sh

または、ディレクトリ全体を対象にする場合は:

   ./bin/shellspec spec/

テストが実行され、結果が表示されます。

  1. アサーションとマッチャー: shellspecでは、様々なアサーションとマッチャーが提供されています。例えば、The status should be successThe output should equal "expected output"などがあります。これにより、期待される動作をテストする際に柔軟かつ表現力豊かなテストを書くことができます。 詳細なマッチャーの一覧や使い方については、shellspecの公式ドキュメントを参照してください。

shellspecは、シェルスクリプトに対してBDDスタイルのテストを提供し、可読性の高いテストコードを書くことができるため、シェルスクリプトプロジェクトでのテスト活動をサポートします。

次のセクションからは、実行環境における具体的な修正内容を記載しています。

ファイル一覧

        modified:   local/Dockerfile
        new file:   local/work/14_shellspec/.shellspec
        new file:   local/work/14_shellspec/hello.sh
        new file:   local/work/14_shellspec/spec/hello_spec.sh
        new file:   local/work/14_shellspec/spec/spec_helper.sh

Dockerfile

@@ -6,8 +6,15 @@ FROM ubuntu:24.04
 
 RUN apt-get update \
  && apt-get install -y --no-install-recommends \
+        ca-certificates \
+        curl \
+        git \
         shellcheck \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
 
 COPY --from=shfmt /bin/shfmt /usr/bin/
+
+# ShellSpec
+RUN curl -fsSL https://git.io/shellspec | sh -s -- --yes \
+ && ln -s /root/.local/lib/shellspec/shellspec /usr/local/bin/

local/work/14_shellspec/spec/spec_helper.sh

下記のコマンドで作成しました。(local/work/14_shellspec/spec/spec_helper.shも合わせて作成されます)

shellspec --init

local/work/14_shellspec/spec/spec_helper.sh

下記のコマンドで作成しました。

shellspec --init

local/work/14_shellspec/spec/hello_spec.sh

Describe 'hello.sh'
  Include ./hello.sh
  It 'says hello'
    When call hello ShellSpec
    The output should equal 'Hello ShellSpec'
  End
End

local/work/14_shellspec/hello.sh

#!/usr/bin/env bash

hello() {
    echo "Hello ${1}"
}

動作確認

下記のコマンドを実行します。

make build

make up

make login

cd 14_shellspec

shellspec -s bash

下記のような出力結果になっていれば成功です。

root@1e257ad6d816:/work/14_shellspec# shellspec -s bash
Running: /usr/bin/bash [bash 5.2.21(1)-release]
.

Finished in 0.10 seconds (user 0.05 seconds, sys 0.01 seconds)
1 example, 0 failures

解説

local/work/14_shellspec/spec/hello_spec.sh

このコードは、shellspecを使用してBashシェルスクリプト hello.sh のユニットテストを実行するためのテストスクリプトの一部です。このスクリプトはBDD(Behavior-Driven Development)スタイルで記述されており、テストスクリプト自体が hello.sh の挙動を記述しています。

ここで使われている shellspec の構文を簡単に解説します:

  • Describe 'hello.sh': テストスクリプト内で実行されるテストスイートを開始します。この場合、テストスイートは ‘hello.sh’ と呼ばれています。
  • Include ./hello.sh: hello.sh ファイルをテストスクリプトに取り込みます。これにより、hello.sh 内の関数や変数などがテストスクリプト内で使用可能になります。
  • It 'says hello': テストケースを開始します。この場合、’says hello’ というテストケースがあります。テストケースは、通常、テストすべき特定の機能や挙動に関する単一の仕様を表します。
  • When call hello ShellSpec: テストケース内で実際のテストアクションを定義します。この行は、hello.sh ファイル内の hello という関数を呼び出しています。引数として文字列 'ShellSpec' を渡しています。
  • The output should equal 'Hello ShellSpec': テストケースで期待される結果を指定します。ここでは、hello 関数が返す出力が 'Hello ShellSpec' であることを期待しています。
  • End: ブロックを終了します。この場合、It ブロックと Describe ブロックが終了しています。

このテストスクリプトは、hello.sh ファイル内の hello 関数が指定された引数を使って正しく動作し、期待通りの出力を生成するかどうかを検証しています。テストを実行することで、シェルスクリプトが期待通りに動作するかどうかを確認できます。

おわりに

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

よっしー
よっしー

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

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

コメント

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