はじめに
リーダブルRspecというタイトルつけましたが、そんな大それたものではないです
テスト書くときでも名前付け重要だからちゃんとしよう!っていうだけの内容です
RspecがBDDのためのツールであることを意識しつつ、
Rspecの流儀に則って適切に名前付けをして書くと読みやすいテストがかけるはずです
describe/context/exampleのメッセージに適切に名前つける
これが出来るだけで当然読みやすいテストになる
describe->テスト対象
context->テストする状況
example->テスト(itやspecify)
なので、
『aaaはbbbの時cccになる』
というテストを書くときは次のようになる
describe 'aaa' do
context 'when bbb' do
it 'should eq ccc'
end
end
重要なのは
- describe/context/exampleだけでテストの概要を説明すること
- 理解しやすい状態になっていないと、負債になってしまう
- 1つのdescribe/context/exampleの中で複数のことをテストは避ける
- 複数のことをテストするようになると、describe/context/exampleのメッセージが曖昧になって理解しづらくなる可能性がある
- そのためにdescribe/context/exampleをきちんと分けること
とりあえず日本語で書いてみよう
英語得意でない人はdecribe/context/exampleを日本語で書き出してみてから英語に直すと良い
describe 'aaa' do
context 'bbbの時' do
it 'はCCCになる'
end
end
- decribe/context/exampleを日本語でまず全部書き出してみる
- この時にexampleの中身やletなどは書かない
- 全部書き出し終わって違和感がなくなったら、英語に直しつつexampleの中身などを書いて埋めていく
- はじめに書いたdecribe/context/exampleに固辞せず臨機応変に変える
- はじめに書いたdecribe/context/exampleでは書きづらかったり過不足があったりすることがあるので
shared_context, shared_examples_for
DRYということばを盾に使われることがあるが、その殆どが読みづらさにつながることが多い
テストを書くときはDRYよりも読みやすさを重視したほうが良いというのはよく言われる
ので、shared_xxxはあまり使わないほうが良いし使うとしても節度を持って使うこと
shared_contextはcontextをshareするもの
いろんな使われ方をするが、
基本的な使い方としては文字通りcontextをshareするもの、というのを意識する
aaaはxxxの時cccになる
dddはxxxの時eeeになる
というテストをshared_contextを使って書くと次のようなテストになる
shared_context "xxx"
describe 'aaa' do
context 'when xxx' do
include_context "xxx"
it 'should eq ccc'
end
end
describe 'ddd' do
context 'when xxx' do
include_context "xxx"
it 'should eq eee'
end
end
この使い方が一番ベーシック
ほかにも色々な使い方があると思うけど、
どういうcontextをshareしてるのかわかるようなメッセージを書くこと
shared_examples_forはit_behaves_likeでメッセージ決める
shared_examples_for 'hoge'
でメッセージを考えるよりも
it_behaves_like 'hoge'
で考えるほうが良い名前がつけやすい
describe 'aaa' do
context 'when bbb' do
it_behaves_like 'hoge'
end
end
例えばこういうテストがあった時に
『aaaはbbbの時にhogeのように振る舞う』と読める
これが違和感無いようにメッセージを決めると良い
『hogeのように振る舞う』なので
it_behaves_like 'a collection'
it_behaves_like 'a listable resource'
it_behaves_like 'a joinable room'
のように名詞が入るのが普通(のはず。英語・国語苦手...)
まとめ
- 名前付けちゃんとして、読む人のために読みやすいテストを書きましょう
- 英語苦手なら日本語でまず書いてみましょう
- あとbetterspecs読みましょう
- ほかにもリーダブルなテストを書く方法は色々あるので常に模索しましょう