こんにちは。よっしーです(^^)
今日は、shellspecによるシェルスクリプトのテストについてご紹介します。
背景
bashにおけるshellspecによるシェルスクリプトのテストについて調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
shellspec
は、シェルスクリプトのユニットテストやBDD(Behavior-Driven Development)スタイルのテストをサポートするためのシェルフレームワークです。shellspec
を使用することで、シェルスクリプトに対して効果的で簡潔なテストを記述し、コードの品質を向上させることができます。
以下は、shellspec
の基本的な特徴と使い方の例です。
- インストール:
shellspec
は、通常、開発者が手動でインストールする必要があります。GitHubからリポジトリをクローンしてセットアップする方法があります。
git clone https://github.com/shellspec/shellspec
cd shellspec
sudo ./bin/shellspec --setup
または、公式のインストールガイドに従ってインストールすることもできます。
- テストスクリプトの作成:
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の終了ステータスを返すことをテストしています。
- テストの実行:
shellspec
のテストスクリプトは、単一のファイルやディレクトリ全体を対象に実行することができます。
./bin/shellspec myscript_spec.sh
または、ディレクトリ全体を対象にする場合は:
./bin/shellspec spec/
テストが実行され、結果が表示されます。
- アサーションとマッチャー:
shellspec
では、様々なアサーションとマッチャーが提供されています。例えば、The status should be success
やThe 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によるシェルスクリプトのテストについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント