シェルのテストについて
nodeならjest、javaならJUnit、など便利な方法がありますが、シェルにもありました。
それがこちら。
シェルのテストについて調べていると、他にもいくつかフレームワークはあるが、
一番便利で出来ることが多いので、これを選んだ。詳細はここへ
https://shellspec.info/comparison.html
公式ページはこちら。こちらから手順通りにやればすぐ使えます。
https://github.com/shellspec/shellspec
書き方
ちょっとした例を実際に書いてみる。ぱっと見クセ強すぎない??
他の言語のテストフレームワークだと、普通は専用の関数に値を渡して値が一致しているかどうかっていうのがよくあるパターンですが、このフレームワークだと英文みたいに値を比較する。でも慣れたら文字通りって感じなので問題ない。
# shellcheck shell=sh
Describe "practice.sh"
It '行ごとに期待する値が出力しているかどうか'
When run script ./practice.sh
The line 1 of output should eq "1"
The line 2 of output should eq "2"
End
It 'いくつ実行されるかどうかのテストで、2つ出力される(コマンドライン引数がないので出力は2つになるはず)'
When run script ./practice.sh
The lines of output should eq 2
End
It '引数で指定した値が出力されているかどうか'
When run script ./practice.sh 5
The line 3 of output should eq "5"
End
End
上記のコードの流れと説明
●「When run script」の後に任意のシェルのファイルを指定して、
期待結果を「eq」の後に書きます。
●一つ目のテストケースでは、「practice.sh」を動かして、1つ目に出力されたものが「1」かどうか、二つ目に出力されたのが「2」かどうかをテストしています。
●ItとEndのかたまりが、一つのテストケースとなります。
異常系のテストでちょっとだけ複雑なことをやりたい場合
以下のように、テスト実行前に任意の処理をして実際にテストして、あとからまた任意の処理をさせることもできます。
「When run script~」の部分で実際にテスト対象のプログラムが処理されるので、前後に任意の処理を書けばよいということになります。
It "【異常系】hogehogeテスト"
# このテストケースのために、正常なsqlファイルを一時的に別の場所に移動
mv ../batch/sql/hoge.sql ../batch/hoge.sql
# 代わりとなる失敗用のsqlファイルを持ってくる
cp hoge-failed.sql ../batch/sql/hoge.sql
When run script ./hoge.sh local
The line 4 of output should eq "ERROR:~が~です"
# 仮に持ってきたsqlファイルを削除
rm ../batch/sql/hoge.sql
# 正常なsqlファイルを元の場所に戻す(次のテストケースで使うため)
mv ../batch/hoge.sql ../batch/sql/hoge.sql
End
その他便利な機能
●モックも作れる
●テスト実行の際、並列実行、ランダム実行
●プロファイラの表示
➡処理の遅いテストが見つかる
※詳しくは公式ドキュメントへ
ちょっとハマったこと
不適切だが、出力結果を空文字としてスペース無しの「""」を期待値に設定したところ、
何をしても<unset>と表示されてしまった。
試しに任意の文字列に変えてみたらいけた。なので、空文字は期待値として指定できないことが分かった
実行結果
※通常のコマンドだけだと、成功したテストケースは、緑色の点でしか表示されず、その成功したテストケースって具体的になんなの?って感じでわざわざコードを見なきゃいけなくなる。
だが、以下のオプションを指定したら、全ての成功失敗問わず全てのテストケースを表示してくれる。
--format documentation
これを標準にしてほしい
●オプション指定したコマンドを実行した場合(テストケース一部失敗)
感想
シェルってシステムのほんの一部でちょこっと使われてるぐらいのものなのかなと思っていたのですが、
定期実行とかでがっつり使われてるものを業務で初めて経験したので、こういう便利なフレームワークを見つけられてよかった。