背景
私は度々、シェルスクリプトを作成し自分の業務の効率化をしており、そのスクリプトが便利だったときは同僚に共有している。
しかし、所詮は自分用に作ったスクリプトのため、他の方が使用した際には意図しないエラーが発生するケースがある。業務効率化のために勧めたスクリプトが逆に無駄なコミュニケーションを生み出してしまった。。。
このようなケースを減らし、より高品質なプログラムを渡せるようにしたいと思い、シェルスクリプトでも単体テストができないかと考えた。そして今回、シェルスクリプトの単体テストが可能なshunit2
を知り、試してみた
概要
-
shunit2
でシェルスクリプトの単体テスト(Unitテスト)が可能 - shunit2のGitHubリポジトリ:https://github.com/kward/shunit2.git
- 1ケース1関数
- テストの関数名は
test~
とする -
. /<shunit2フォルダのパス>/shunit2
でshunit2の起動が可能
shunit2
shunit2
を使用する。
shunit2
はシェルスクリプトの単体テストを実施できるライブラリであり、シェルスクリプトで作成されている
そのため、他言語の環境構築が必要なく、GitHubからクローンしたらすぐに使用することができる。
最高!
■GitHubリポジトリ
https://github.com/kward/shunit2.git
環境構築
私のPC(ホストマシン)はWindowsなので、まずはDockerでLinuxの環境を用意する
作業ユーザーのルートディレクトリにshunit
をダウンロードする
FROM ubuntu:20.04
# gitと便利なパッケージをインストール
RUN apt update && apt upgrade -y
RUN apt-get install -y git
# shunit2をクローン
RUN git clone https://github.com/kward/shunit2.git ~/shunit2
# ユーザー作成なども実施したが本記事と無関係のため割愛
※クローンする場所はどこでも良い。自分がわかりやすいところに置いてください
スクリプトの作成
実行するシェルスクリプトを作成する
今回は「第一引数の名前のフォルダを作成する」スクリプトexe.sh
を作成した
#! /bin/bash
# フォルダを自動で作成するシェルスクリプト
folderName=$1
mkdir $folderName
テストコードの作成
次にテストコードを作成する
テスト用のファイルtest.sh
を作成しテストコードを記入する。( ファイル名は任意。今回は便宜上test.sh
とした )
テストコードは以下の3点
- 1ケースごとに1つ関数を作成する
- 関数名の頭字句は
test
とする - ファイルの末尾に
shunit2
の実行コマンドを記入する。コマンドは. /<shunit2フォルダのパス>/shunit2
この2つに注意してテストコードを作成する
#! /bin/bash
# 状況:「testFolder」フォルダが存在しない
# 期待値「testFolder」フォルダが作成される(正常終了)
testCanMkdir(){
# 1. 準備:前提状況を作成
folderName="testFolder"
if [ -d $folderName ]; then
rm -r $folderName
fi
# 2. 実施
# exe.sh:先ほど作成したスクリプト
. exe.sh $folderName
# 3. 確認
# 1.正常終了したこと
assertEquals $? 0
# 2.フォルダが存在すること
assertTrue "[ -d $folderName ]"
}
. ~/shunit2/shunit2
実行前確認
1. フォルダ構成
フォルダを作成するスクリプトのテストなので、テスト実行前に現在のフォルダ構成を確認
上で作成したスクリプトが2つ存在する
.
|-- exe.sh # フォルダを自動生成するスクリプト
`-- test.sh # テストスクリプト
2. 実行可能に変更
exe.sh
とtest.sh
に実行可能にする
chmod u+x exe.sh test.sh
テストコードの実行
作成したテストファイルtest.sh
を実行する。
コマンドは<path>/実行ファイル
にする。. <path>/test.sh
ではテストが実行されなかった。
./test.sh
このような出力があれば成功!
testCanMkdir
Ran 1 test.
OK
余談:テストケースの追加
テストケースを増やす場合は、テストファイル内に関数を増やす
実行時に既にフォルダが存在するケース(testDirAlreadyExist)を追加した
#! /bin/bash
# 状況:「testFolder」フォルダが存在しない
# 期待値「testFolder」フォルダが作成される(正常終了)
testCanMkdir(){
# 省略
}
# 状況:「testFolder」フォルダが存在する
# 期待値「testFolder」フォルダが作成されない(異常終了)
testDirAlreadyExist(){
folderName="testFolder"
if [ -d $folderName ]; then
rm -r $folderName
fi
mkdir $folderName
. exe.sh $folderName
# 1.異常終了したこと
assertEquals $? 1
# 2.フォルダが存在すること
assertTrue "[ -d $folderName ]"
}
. ~/shunit2/shunit2
実行するとRan 2 test.
と出力される
$ ./test.sh
testCanMkdir
testDirAlreadyExist
mkdir: cannot create directory 'testFolder': File exists
Ran 2 tests.
OK
あとがき
shunit2
を使うことでシェルスクリプトの単体テストを行うことができた。これを活用できれば運用で使用するシェルスクリプトの品質を高めることができると思った。
また、もし機会があれば他の人に共有する前にテストを行い、業務効率化とシェルスクリプトのテストの二面でドヤ顔をしたい 笑