今度 jq をテーマにして JJUG CCC で発表するのですが、 jq のスクリプトに対するテストフレームワークはないのか探してみたところ見つけられなかったので、テストフレームワーク(フレームワークと言うには機能が足りないが…)を作ってみた。なお、見つけられなかったのは単に検索ちからがないだけなので、多分存在すると思うので知ってたら誰か教えてほしい…
使い方
- 上記の release から zip でも tarball でもダウンロードして、解凍後に
jq-unit.jqというファイルを$HOME/.jqディレクトリーの中に置く - jq にて
import "jq-unit" as jqunit;を記述すると使えるようになる
実行例
jqはインストール済みとする$HOME/.jqにjq-unit.jqを配置してあるものとする
テストが通る例として、以下のコマンドを実行する
jq -n '
import "jq-unit" as unit;
unit::allSpecs(
unit::test("1 + 2 = 3") |
unit::Given(1) |
unit::When(. + 2) |
unit::Then(. == 3)
)
'
実行すると次のような結果が出力される

テストが失敗すると、エラーが発生するのを次のコマンドで確かめる
jq -n '
import "jq-unit" as unit;
unit::allSpecs(
unit::test("1 + 2 = 5") |
unit::Given(1) |
unit::When(. + 2) |
unit::Then(. == 5)
)
'
明らかにテストが間違えているこのテストを実行すると次のように出力される

このとき、 jq は終了ステータス 5 で終わるので、各種の CI プラットフォームにてエラーとなって終了するはず
なお、レポーティング機能などがないので、標準出力と標準エラー出力を tee にでも流すとよいと思われる
allSpecs という関数にテストを渡しているが、 allSpecs という名前からも明らかなようにこの関数はイテレーターを渡せる。
つまり複数のテストがある場合は、各テストをカンマで区切って渡せばよい
より詳細な(と言ってもこれ以上の機能はないのだが…)使い方を知りたい場合は、レポジトリーの examples ディレクトリーに例がいくつかあるので、それを参照するとよいと思われる