bats – Bashスクリプトの単体テストを実行する(TAP対応)

テスト
スポンサーリンク

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, --prettyTAP 出力/人間向け整形出力を明示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

(Bats-Core)

TAP を強制して機械可読に(CI向け)

説明:端末上でも TAP を強制出力。
コマンド

bats --formatter tap test/addition.bats

出力例(例)

1..2
ok 1 addition using bc
ok 2 addition using dc

(Bats-Core)

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/

(Bats-Core)

エラー例:出力先ディレクトリが存在しない

説明--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)
  • ※同名注意:batcat 互換ビューアで別ツール。混同に注意。 (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)
スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント