bats(7)

名称

bats - Bats テストファイルフォーマット

説明

Bats テストファイルは特殊な構文でテストケースを定義した Bash スクリプトです。内部的には、各テストケースは説明が書かれたただの関数です。

#!/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 ]
}

各 Bats テストファイルは n+1 回評価されます。n はファイル内のテストケースの数です。最初の実行時にテストケースの数がカウントされ、それから繰り返し別々のプロセスでテストケースが実行されます。

RUN ヘルパー

Bats テストの多くはコマンドの実行と終了ステータスと出力のアサーションが必要です。Bats にはコマンドとして引数を実行して、終了ステータスと出力を特殊なグローバル変数に保存し、ステータスコード 0 を返してテストケースのアサーションに続行することができる run ヘルパーが存在します。

例えば、foo コマンドをテストするとして、存在しないファイル名を指定したときに、ステータスコード 1 が返されてエラーメッセージが出力されることを確認するには:

@test "invoking foo with a nonexistent file prints an error" {
  run foo nonexistent_filename
  [ "$status" -eq 1 ]
  [ "$output" = "foo: no such file ´nonexistent_filename´" ]
}

$status 変数にはコマンドのステータスコードが入り、$output 変数にはコマンドの標準出力と標準エラーストリームが結合された文字列が入ります。

さらに、出力の各行に簡単にアクセスできるように特殊な変数 $lines 配列が用意されています。例えば何も引数を付けずに foo を実行したときに1行目に使用方法が出力されることをテストしたい場合:

@test "invoking foo without arguments prints usage" {
  run foo
  [ "$status" -eq 1 ]
  [ "${lines[0]}" = "usage: foo <filename>" ]
}

LOAD コマンド

複数のテストファイルで共通のコードを共有したいと思うかもしれません。Bats には現在のテストファイルから相対パスで Bash ソースファイルを読み込める便利な load コマンドが存在します。例えば、test/foo.bats に Bats テストがある場合、以下のコマンドでテストファイルに test/test_helper.bash スクリプトが読み込まれます:

load test_helper

環境を設定したりフィクスチャをロードする関数を共有したい場合に有用です。

SETUP と TEARDOWN 関数

特別な setupteardown 関数を定義することで、テストケースの前と後に実行させることができます。これらの関数を使ってフィクスチャをロードしたり、環境を設定したり、テスト後のゴミを掃除することができます。

テストケースの外側のコード

テストファイルの @test 関数の外側にコードを記述することができます。例えば、依存関係をチェックして、満たされていない場合に即座にテストを失敗させたい場合などに有用です。ただし、@test の外側のコードの出力を行うときは、setupteardown 関数を stderr (>&2) にリダイレクトさせる必要があります。そうしないと、出力によって標準出力の TAP ストリームが汚染されて Bats の実行が失敗してしまうおそれがあります。

特殊な変数

Bats のテストを確認するためのグローバル変数が複数存在します:

  • $BATS_TEST_FILENAME は Bats テストファイルの完全なパスになります。
  • $BATS_TEST_DIRNAME は Bats テストファイルが配置されたディレクトリになります。
  • $BATS_TEST_NAMES は各テストケースの関数名の配列になります。
  • $BATS_TEST_NAME は現在のテストケースが含まれている関数の名前になります。
  • $BATS_TEST_DESCRIPTION は現在のテストケースの説明文になります。
  • $BATS_TEST_NUMBER はテストファイルにおける現在のテストケースの (1始まりの) インデックスになります。
  • $BATS_TMPDIR は一時ファイルを保存するのに使用するディレクトリのパスになります。

関連項目

bash(1), bats(1)