こんにちは。よっしーです(^^)
今日は、shUnit2によるシェルスクリプトのテストについてご紹介します。
背景
bashにおけるshUnit2によるシェルスクリプトのテストについて調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
shUnit2(シェユニット2)は、シェルスクリプトをテストするためのフレームワークです。シェルスクリプトは、システム管理、自動化、ビルドスクリプトなどのさまざまな用途で使用されますが、これらのスクリプトが期待どおりに動作するかを確認するためには、テストが欠かせません。shUnit2は、シェルスクリプトのユニットテストを支援するために設計されています。
shUnit2の特徴:
- シンプルな構文: shUnit2はシンプルで直感的な構文を提供し、シェルスクリプトのテストを容易にします。
- アサーション: テストケース内でアサーションを使用して、期待される結果と実際の結果を比較します。これにより、スクリプトが正しく機能しているかどうかを確認できます。
- フィクスチャサポート: テストの前後に特定のセットアップやクリーンアップコードを実行できるフィクスチャのサポートがあります。
- 複数のテストランナー: shUnit2はいくつかの異なるテストランナーで使用でき、選択したランナーに応じて結果を表示できます。
- 対話モード: テストを対話的に実行できる対話モードが用意されています。
shUnit2を使用するためには、まずshUnit2のスクリプトをダウンロードし、シェルスクリプト内で読み込む必要があります。その後、テストケースを記述して実行することができます。
以下は、簡単なshUnit2のテストスクリプトの例です:
#!/bin/sh
testEquality() {
assertEquals "Expected and actual values should be equal" 42 42
}
testString() {
assertSame "Expected and actual strings should be the same" "hello" "hello"
}
# テスト実行
. shunit2
この例では、testEquality
とtestString
という2つのテストケースが定義されています。これらのテストケースでは、assertEquals
とassertSame
というアサーションを使用して、期待される結果と実際の結果を比較しています。
注意: shUnit2はシェルスクリプトのテストに役立ちますが、より複雑なテストや依存関係の解決などが必要な場合は、他のテストフレームワークやツールを検討することもあります。
修正ファイル一覧
modified: local/Dockerfile
new file: local/work/15_shunit2/15_shunit2.sh
new file: local/work/15_shunit2/hello.sh
Dockerfile
@@ -18,3 +18,6 @@ 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/
+
+# shUnit2
+RUN git clone https://github.com/kward/shunit2.git /usr/local/bin/shunit2
15_shunit2/15_shunit2.sh
#!/usr/bin/env bash
# shellcheck source=/dev/null
. ./hello.sh
# テスト関数
testHello() {
output=$(hello ShellSpec)
assertEquals "${output}" "Hello ShellSpec"
}
# shellcheck source=/dev/null
. /usr/local/bin/shunit2/shunit2
15_shunit2/hello.sh
#!/usr/bin/env bash
hello() {
echo "Hello ${1}"
}
動作確認
下記のコマンドを実行します。
make build
make up
make login
cd 15_shunit2/
chmod +x 15_shunit2.sh
./15_shunit2.sh
下記のような出力になっていれば成功です。
解説
15_shunit2/15_shunit2.sh
このシェルスクリプトは、シェルスクリプトのテストを行うために使用されるものです。具体的には、hello.sh
という別のシェルスクリプトに対する単体テストを行います。また、shunit2
というユニットテストフレームワークが使用されています。
ここで、コードの各部分を解説します。
#!/usr/bin/env bash
: この行は、このスクリプトがBashシェルで実行されることを示しています。/usr/bin/env
を使用することで、環境に応じたBashのパスを探し出して実行します。# shellcheck source=/dev/null
: このコメントは、ShellCheckと呼ばれる静的解析ツールに対して、この行は無視されるように指示しています。具体的には、ShellCheckに対して./hello.sh
や/usr/local/bin/shunit2/shunit2
がソースとして正しくない旨を無視するよう指定しています。. ./hello.sh
: この行は、hello.sh
というシェルスクリプトを読み込んでいます。これにより、hello.sh
内で定義されている関数や変数がこのスクリプトで利用できるようになります。testHello()
関数: これは実際のテストケースを定義しています。testHello
関数内では、hello
関数を呼び出し、その結果を変数output
に格納しています。そして、assertEquals
関数を使用して、output
が期待される文字列と一致するかを確認しています。つまり、hello ShellSpec
という呼び出しに対して、正しい結果が得られるかどうかを検証しています。# shellcheck source=/dev/null
: このコメントは、再びShellCheckに対して、この行は無視されるように指示しています。具体的には、/usr/local/bin/shunit2/shunit2
がソースとして正しくない旨を無視するよう指定しています。. /usr/local/bin/shunit2/shunit2
: 最後に、shunit2
というユニットテストフレームワークを読み込んでいます。これにより、このスクリプト内でshunit2
が提供する機能やアサーションを使用できるようになります。
このスクリプト全体は、hello.sh
というシェルスクリプトに対する単体テストを行うものであり、テスト結果はshunit2
を用いて出力されます。
おわりに
今日は、shUnit2によるシェルスクリプトのテストについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント