bats は Bash Automated Testing System(bats-core)のテストランナーで、.bats ファイルに書いたテストを実行し、TAP(Test Anything Protocol)やJUnit形式で結果を出力できます。Bash 3.2 以降で動作し、CIでの機械可読なレポートにも向きます。 (Bats-Core)
実務では、シェルスクリプトの回帰テスト、CIでの並列実行、JUnit出力による可視化などに使います。 (Bats-Core)
構文(Syntax)
# 基本
bats [OPTIONS] <tests>
# <tests>: .bats ファイル、または .bats を含むディレクトリ
# 代表例
bats test/ # 直下の .bats を実行(再帰しない)
bats -r test/ # サブディレクトリも含めて実行
bats -F tap test/login.bats # TAP で出力
bats --report-formatter junit -o reports test/ # JUnit を reports/ に出力
bats -j 4 test/ # 並列実行(GNU parallel 等が必要)
bats は端末上では人間向けの整形表示、非端末(CIやリダイレクト)ではデフォルトで TAP を出力します。--formatter tap で端末でもTAPを強制できます。 (Bats-Core)
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-r, --recursive | ディレクトリ配下を再帰的に探索して .bats を実行 | bats -r test/ (Bats-Core) |
-f, --filter <regex> | テスト名(説明)にマッチするものだけ実行 | `bats -f ‘login |
--filter-tags <A,B> | 指定タグをすべて含むテストのみ実行(!tagで否定) | bats --filter-tags 'slow,!network' test/ (Bats-Core) |
-F, --formatter <type> | 出力フォーマット:pretty(既定), tap, tap13, junit, もしくは外部フォーマッタの絶対パス | bats -F tap test.bats / bats -F junit test.bats (Bats-Core) |
--report-formatter <type> | 画面出力とは別にレポートファイルを生成 | bats --report-formatter junit -o reports test/ (Bats-Core) |
-o, --output <dir> | レポートの出力先ディレクトリ(事前に存在が必要) | bats --report-formatter junit -o reports test/ (Bats-Core) |
-j, --jobs <N> | 並列実行(GNU parallel か Rush が必要) | bats -j 4 test/ (Bats-Core) |
--no-parallelize-across-files | 並列をファイル内に限定(ファイル間は直列) | bats -j 4 --no-parallelize-across-files test/ (Bats-Core) |
--no-parallelize-within-files | ファイル内の並列化を無効(テストケースは直列) | bats -j 4 --no-parallelize-within-files test/ (Bats-Core) |
-t, --tap / -p, --pretty | TAP 出力/人間向け整形出力を明示 | bats -t test.bats / bats -p test.bats (Bats-Core) |
-T, --timing | 各テストの実行時間を表示 | bats -T test/ (Jack Henschel’s Blog) |
-x, --trace | 実行コマンドを set -x 風に表示 | bats -x test/ (Bats-Core) |
-c, --count | 実行せず件数のみを表示 | bats -c test/ (Bats-Core) |
実行例
基本:テストファイル/ディレクトリを実行
説明:直下の .bats を走らせ、成功・失敗件数を表示。
コマンド
bats test/
出力例(例)
✓ addition using bc
✓ addition using dc
2 tests, 0 failures
TAP を強制して機械可読に(CI向け)
説明:端末上でも TAP を強制出力。
コマンド
bats --formatter tap test/addition.bats
出力例(例)
1..2
ok 1 addition using bc
ok 2 addition using dc
JUnit レポートを生成(CIで可視化)
説明:画面には通常出力、同時に JUnit XML を保存。
コマンド
mkdir -p reports
bats --report-formatter junit -o reports test/
# 生成物: reports/report.xml など
(--output のディレクトリは事前作成が必要) (Bats-Core)
並列実行で高速化
説明:GNU parallel 等が入っていれば、テストを並列化。
コマンド
bats -j 4 -r test/
(テスト間に依存があると順序が前後するため注意) (Bats-Core)
フィルタで一部だけ実行
説明:名前(説明)に login を含むテストだけを実行。
コマンド
bats -f 'login' test/
エラー例:出力先ディレクトリが存在しない
説明:--report-formatter と -o でフォルダ未作成だとエラー終了。
コマンド
bats --report-formatter junit -o reports test/
#→ 事前に `mkdir -p reports` を実施
(-o は存在するディレクトリ必須) (Bats-Core)
関連コマンド
bash:テスト対象の実行環境。shellcheck:Bash スクリプトの静的解析(lint)。parallel/rush:-j/--jobs並列実行に必要。 (Bats-Core)- bats 用ライブラリ:
bats-support(補助)、bats-assert(アサート)、bats-file(ファイル系補助)など(loadで読込)。 (Bats-Core) - ※同名注意:
batはcat互換ビューアで別ツール。混同に注意。 (GitHub)
備考
- 出力形式:端末では人間向け整形、非端末では TAP を既定で出力。
-t/--formatter tapで明示可。 (Bats-Core) - テストの書き方:
@test "説明" { ... }で定義。外部コマンドの結果検証はrun <cmd>を使い、$status(終了コード)/$outputをアサートします。共通処理はloadで読み込み。 (Bats-Core) - 並列実行の注意:
--jobs使用時はテスト間の依存や共有書き込みに注意。必要なら--no-parallelize-*系で制御。 (Bats-Core) - バージョン依存機能:新機能利用時は
bats_require_minimum_versionで必要バージョンを宣言できます。 (Bats-Core) - 再帰実行:ディレクトリ指定はデフォルトで非再帰。サブディレクトリも走らせたい場合は
-rを付けます。 (Bats-Core)
実際のテストコードの記述についてはこちらの記事にまとめています
参考
- 公式ドキュメント(Usage / Writing tests / Parallel) (Bats-Core)
- Debian/Ubuntu manページ:
bats(1)/bats(7)(Debian Manpages) - GitHub: bats-core(README・リリース・Issue) (GitHub)
- TAP(Test Anything Protocol)仕様の紹介(bats の出力例あり) (Bats-Core)

コメント