RSpecのdescribe, context, itと感想
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 はさらにその上をいくらしいんだけど。