0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルのテストコードが書けるフレームワーク使ってみた

Last updated at Posted at 2021-01-14

シェルのテストについて

nodeならjest、javaならJUnit、など便利な方法がありますが、シェルにもありました。
それがこちら。

cf597500-688b-11e9-9bbf-e7a4a2cff228.png

シェルのテストについて調べていると、他にもいくつかフレームワークはあるが、
一番便利で出来ることが多いので、これを選んだ。詳細はここへ
https://shellspec.info/comparison.html

公式ページはこちら。こちらから手順通りにやればすぐ使えます。
https://github.com/shellspec/shellspec

書き方

ちょっとした例を実際に書いてみる。ぱっと見クセ強すぎない??
他の言語のテストフレームワークだと、普通は専用の関数に値を渡して値が一致しているかどうかっていうのがよくあるパターンですが、このフレームワークだと英文みたいに値を比較する。でも慣れたら文字通りって感じなので問題ない。

anime-suko.sh
# 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~」の部分で実際にテスト対象のプログラムが処理されるので、前後に任意の処理を書けばよいということになります。

anime-suko.sh
    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

これを標準にしてほしい

●普通にコマンドを実行した場合(テストケース全て成功)
無題.png

●普通にコマンドを実行した場合(テストケース一部失敗)
無題2.png

●オプション指定したコマンドを実行した場合(テストケース一部失敗)
無題3.png

感想

シェルってシステムのほんの一部でちょこっと使われてるぐらいのものなのかなと思っていたのですが、
定期実行とかでがっつり使われてるものを業務で初めて経験したので、こういう便利なフレームワークを見つけられてよかった。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?