mike-neckのブログ

Java or Groovy or Swift or Golang

jq のユニットテストフレームワークを作ってみた

今度 jq をテーマにして JJUG CCC で発表するのですが、 jq のスクリプトに対するテストフレームワークはないのか探してみたところ見つけられなかったので、テストフレームワーク(フレームワークと言うには機能が足りないが…)を作ってみた。なお、見つけられなかったのは単に検索ちからがないだけなので、多分存在すると思うので知ってたら誰か教えてほしい…

github.com


使い方

  1. 上記の release から zip でも tarball でもダウンロードして、解凍後に jq-unit.jq というファイルを $HOME/.jq ディレクトリーの中に置く
  2. jq にて import "jq-unit" as jqunit; を記述すると使えるようになる

実行例

  • jq はインストール済みとする
  • $HOME/.jqjq-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)
)
'

実行すると次のような結果が出力される

f:id:mike_neck:20201003005611p:plain

テストが失敗すると、エラーが発生するのを次のコマンドで確かめる

jq -n '
import "jq-unit" as unit;

unit::allSpecs(
  unit::test("1 + 2 = 5") |
  unit::Given(1) |
  unit::When(. + 2) |
  unit::Then(. == 5)
)
'

明らかにテストが間違えているこのテストを実行すると次のように出力される

f:id:mike_neck:20201003010044p:plain

このとき、 jq は終了ステータス 5 で終わるので、各種の CI プラットフォームにてエラーとなって終了するはず

なお、レポーティング機能などがないので、標準出力と標準エラー出力tee にでも流すとよいと思われる


allSpecs という関数にテストを渡しているが、 allSpecs という名前からも明らかなようにこの関数はイテレーターを渡せる。

つまり複数のテストがある場合は、各テストをカンマで区切って渡せばよい


より詳細な(と言ってもこれ以上の機能はないのだが…)使い方を知りたい場合は、レポジトリーの examples ディレクトリーに例がいくつかあるので、それを参照するとよいと思われる