やりたいこと
record の順番も field の順番もバラバラな JSON があるんだけど、この JSON 同士を比較してどこに差があるのかを知りたい。
方法
毎度おなじみ jq を使う。
- –sort-keys オプションを使うと field の方を sort できる
- 'sort()' あるいは 'sort_by()' という function で record を sort できる
取れました。jq 'sort_by(.<col>) --sort-keys で出力した結果同士を比較するとだいたい目的を達成できました。「だいたい」なのがなぜかよく分からんですが。
— wtnabe (@wtnabe) February 26, 2020
ということでまとめると
jq --sort_by('.<key>') --sort-keys <file>
と叩くと JSON の record と field 両方が sort できるので、sort 済みの JSON 同士を比較すれば human readable な diff を生成できるようになります。
RSpec の動かし方だけは分かってたんだけど、あんまり真面目に整理したことがなかった。少しだけ真面目にドキュメント読んでみた。
基本概念
explicit subject - Subject - RSpec Core - RSpec - Relish
RSpec is a DSL for creating executable exmaples
おぉ、なるほど。
コードが動作例のように見えることが大事ってことか。テストらしく書くのではなく動作例らしく書く。そうすると実行結果のレポートもとても自然に読める。これが設計書のように読める。
基本構造
- ファイル : spec
- describe : example group
- context : alias of group
- it : example
- context : alias of group
it はどこで定義されているのかよく分からないけど
it 'behavior' do
...
テストしたい振る舞い
...
end
でも
it {
...
テストしたい振る舞い
...
}
でも良いらしい。it の中身が DSL の力を借りて英文そのもののであれば `behavior' は省略しちゃうという流儀もあるらしい。
でもそれって
日本語でレポートを作れる
っていうメリットがなくなるような?
context ってどう使うの?
describe の alias として context は用意されているが、こんな感じで使うのがいいんじゃないか案。
describe MyClass do
describe 'this method' do
context '条件' do # 英語だと 'in ...' とか 'when ...' とか ?
it '振る舞い' do
obj.should be_XXX
end
end
end
end
みたいな感じがE和スタンダードみたい。(間違ってたらツッコンでください!)
確かにこれが自然かも。なるほどなぁ。
Twitter / @SHIBATA Hiroshi: @wtnabe あー、そこについてはケースバイケース …
感心したこと
RSpec って書き方自体は知ってたんだけど、あんまり意味が分かってなかった。あと、読みやすさの代わりに書きにくさがあるなーと感じていたんだけど、これは誤解だなと思った。むしろテストを分類しやすくてとても書きやすい。
これまでも xUnit 系のツールは使っていたんだけど、なんだかとても読みにくくメンテしにくいテストコードを量産していたように思う。少なくとも確認したいことの単位でメソッドを起こしたりはしていなかった。何かを意図していたわけではないけど、一つのメソッドに対するテストメソッドが 3つも 4つもあるのも変な感じがしていたし、メソッド名が長くなりがちなのもいい印象を持てなかった。
それが RSpec だと違和感なく書ける。describe を階層化できるから確認したい振る舞いの名前に重複が発生しない。つまり DRY だ。
もう一つ、diff の出力が素晴らしい。もうほんとこれはすごくいい。これだけでも Test::Unit からの乗り換えに十分値する。
まぁ Test::Unit2 はさらにその上をいくらしいんだけど。
なんとなく私と同じような結論に至りつつあるらしい。
まーでも私は個人的にはオープンソースなんて面倒くさいからみんなフリーソフトウェアにしちゃえ派ですが(こら
出たぞ出たぞ。そろそろ current に移行しちゃおうかな?
phpdocumentor はデフォルトで @access private なメソッドのドキュメントを生成しないようだ。これがコマンドラインから起動するならオプションの設定は楽なのだが、eclipse からの phpdoc はどうやってオプション設定するのだろう?(^^; まぁ @access private は PHP 5 にならないと意味ないコメントなのだが。
Lynx に対する w3m の最大のメリットはマウスが使えることとレイアウト用の TABLE も正しくレンダリングできることだと思っていた(タブは使わないので)が、実は Lynx でもマウスが使えた。けっこうびっくり。でも cygwin と Debian の Lynx 2.8.4 では使えたが、FreeBSD では terminal の設定に影響されて「カラー表示でマウスを使う」ことができないでいる。うーぬ。
最近、slashdot.jp のメインのストーリーの方がさっぱり面白くないと感じていたのですが、先日の脱線をきっかけに日記の方に重点をシフトしようかなと思い始めました。ちょいとうろうろしていたのですが(このうろうろがものすごくやりにくい!)、ふと見たバナーページのバナーに気に入ったものが一つもないので、
しゃあなしで
自分で作ってしまいました。