PICTとjoでテストケースをJson形式で作る

はじめに

PICTは、Microsoft製のPairwise法でテストケースをいい感じに絞り込んでくれるコマンドラインツール。 詳しくは↓記事を参照。(私がPICTの存在を知ったきっかけ) qiita.com

で、このPICTの出力は tsv 形式なので、 まあそのままでもテストケースとしては十分に扱いやすい。

ただ、せっかくだから Json 形式にしてあげたい。 そこで jo コマンドを使ってみた。

PICTに食わせるファイル(モデルファイル)

DATA1: A, B, C
DATA2: 1, 2, 3

pictでくみあわせ作成

$ pict a.txt
DATA1   DATA2
A   3
A   2
B   3
C   2
B   1
C   1
B   2
C   3
A   1

作りたい json

[
   {
      "DATA1": "A",
      "DATA2": 3
   },
   {
      "DATA1": "A",
      "DATA2": 2
   },
   {
      "DATA1": "B",
      "DATA2": 3
   },
   {
      "DATA1": "C",
      "DATA2": 2
   },
   {
      "DATA1": "B",
      "DATA2": 1
   },
   {
      "DATA1": "C",
      "DATA2": 1
   },
   {
      "DATA1": "B",
      "DATA2": 2
   },
   {
      "DATA1": "C",
      "DATA2": 3
   },
   {
      "DATA1": "A",
      "DATA2": 1
   }
]

試行錯誤の結果

$ pict a.txt \
 | \ # awk で "jo DATA1=A DATA2=1" のような行を作っている
awk 'NR==1{for(i=1;i<=NF;i++){h[i]=$i}} NR!=1{r="jo"; for(i=1;i<=NF;i++){ r = r " " h[i] "=" $i } } $0 = r' \
 | \ # awk で作った jo コマンドを実行して {"DATA1":"A", "DATA2":1} を作っている
sh \
 | \ # jo -a で Array にしている , -p は pretty-print の意で見やすくするために使用
jo -a -p

メモ

jo -a $(jo DATA1=A DATA2=1) はうまく動くんだけど、 echo jo DATA1=A DATA2=1 | jo -a は動かない。

$ echo jo DATA1=A DATA2=1 | jo -a
["jo DATA1=A DATA2=1"]

まあ、冷静に考えれば当然で、jo -a は渡された文字列をそのまま素直に配列にしてるだけなので、 事前にjsonオブジェクトになるよう書いてあげないといけない。

つまり↓なら良い。

$ jo DATA1=A DATA2=1 | jo -a
[{"DATA1":"A", "DATA2":"1"}]