シェルコマンドやシェルスクリプトの実行結果をテストできる「bats」を試してみた
シェルコマンドやシェルスクリプト (Bash) の実行結果をテストできる、「bats」というツールを試してみた。
目次
bats をインストールする
bats は GitHub からコードを落としてきて、install.sh
を叩けばインストールできる。
$ git clone https://github.com/sstephenson/bats.git
$ cd bats
$ ./install.sh /usr/local
コレで bats
コマンドが使えるようになる。
試しに使ってみる
まずはお試しということで、公式の README に載っているコードをそのまま動かしてみる。
以下がテストコードになっているので、コレを addition.bats
として保存しよう。
#!/usr/bin/env bats
@test "addition using bc" {
result="$(echo 2+2 | bc)"
[ "$result" -eq 4 ]
}
@test "addition using dc" {
result="$(echo 2 2+p | dc)"
[ "$result" -eq 4 ]
}
基本はシェルスクリプトとほとんど同じ構文で記述できる。この中では echo
と bc
・dc
コマンドを利用し、足し算の結果が正しく出力されているか確認するテストになっている。
テストを実行する時は、以下のようにする。
$ bats addition.bats
✓ addition using bc
✓ addition using dc
2 tests, 0 failures
2件のテストが成功したことが確認できる。出力形式を TAP に沿ったモノにするには、--tap
オプションを付ければ良い。
実行結果に特定の文字列が含まれているか確認してみる
さきほどの例では簡単な出力内容だったので、実行結果を入れた変数 $result
を直接 -eq
で比較できた。しかし、複数行の実行結果から特定の文字列が含まれていることを確認したい時なんかは、ちょっとやり方を変えないといけない。
#!/usr/bin/env bats
@test "multi lines output" {
# 任意のコマンドを実行する
result="$(some-function)"
# 変数 $result から結果を grep する
echo $result | grep 'some result text'
}
bats に組み込みのコマンド「run
」を利用した時の、$output
や $lines
から特定の文字列が含まれていることを確認するのではなく、コマンドの実行結果を変数に入れ、それを grep
することで確認する (grep
はヒットしないと異常終了になるためテストが失敗する)。
シェルスクリプトとほとんど同じ構文で書きやすいので、シェルスクリプトのテストを書きたい時は使ってみてはどうだろう。