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

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

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

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

スポンサーリンク

背景

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

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

実行環境について

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

概要

shUnit2(シェユニット2)は、シェルスクリプトをテストするためのフレームワークです。シェルスクリプトは、システム管理、自動化、ビルドスクリプトなどのさまざまな用途で使用されますが、これらのスクリプトが期待どおりに動作するかを確認するためには、テストが欠かせません。shUnit2は、シェルスクリプトのユニットテストを支援するために設計されています。

shUnit2の特徴:

  1. シンプルな構文: shUnit2はシンプルで直感的な構文を提供し、シェルスクリプトのテストを容易にします。
  2. アサーション: テストケース内でアサーションを使用して、期待される結果と実際の結果を比較します。これにより、スクリプトが正しく機能しているかどうかを確認できます。
  3. フィクスチャサポート: テストの前後に特定のセットアップやクリーンアップコードを実行できるフィクスチャのサポートがあります。
  4. 複数のテストランナー: shUnit2はいくつかの異なるテストランナーで使用でき、選択したランナーに応じて結果を表示できます。
  5. 対話モード: テストを対話的に実行できる対話モードが用意されています。

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

この例では、testEqualitytestStringという2つのテストケースが定義されています。これらのテストケースでは、assertEqualsassertSameというアサーションを使用して、期待される結果と実際の結果を比較しています。

注意: 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というユニットテストフレームワークが使用されています。

ここで、コードの各部分を解説します。

  1. #!/usr/bin/env bash: この行は、このスクリプトがBashシェルで実行されることを示しています。/usr/bin/envを使用することで、環境に応じたBashのパスを探し出して実行します。
  2. # shellcheck source=/dev/null: このコメントは、ShellCheckと呼ばれる静的解析ツールに対して、この行は無視されるように指示しています。具体的には、ShellCheckに対して./hello.sh/usr/local/bin/shunit2/shunit2がソースとして正しくない旨を無視するよう指定しています。
  3. . ./hello.sh: この行は、hello.shというシェルスクリプトを読み込んでいます。これにより、hello.sh内で定義されている関数や変数がこのスクリプトで利用できるようになります。
  4. testHello() 関数: これは実際のテストケースを定義しています。testHello関数内では、hello関数を呼び出し、その結果を変数outputに格納しています。そして、assertEquals関数を使用して、outputが期待される文字列と一致するかを確認しています。つまり、hello ShellSpecという呼び出しに対して、正しい結果が得られるかどうかを検証しています。
  5. # shellcheck source=/dev/null: このコメントは、再びShellCheckに対して、この行は無視されるように指示しています。具体的には、/usr/local/bin/shunit2/shunit2がソースとして正しくない旨を無視するよう指定しています。
  6. . /usr/local/bin/shunit2/shunit2: 最後に、shunit2というユニットテストフレームワークを読み込んでいます。これにより、このスクリプト内でshunit2が提供する機能やアサーションを使用できるようになります。

このスクリプト全体は、hello.shというシェルスクリプトに対する単体テストを行うものであり、テスト結果はshunit2を用いて出力されます。

おわりに

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

よっしー
よっしー

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

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

コメント

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