シェルコマンドやシェルスクリプトの実行結果をテストできる「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 ]
}

基本はシェルスクリプトとほとんど同じ構文で記述できる。この中では echobcdc コマンドを利用し、足し算の結果が正しく出力されているか確認するテストになっている。

テストを実行する時は、以下のようにする。

$ 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 はヒットしないと異常終了になるためテストが失敗する)。


シェルスクリプトとほとんど同じ構文で書きやすいので、シェルスクリプトのテストを書きたい時は使ってみてはどうだろう。