LoginSignup
122
112

More than 5 years have passed since last update.

リーダブルRspec

Posted at

はじめに

リーダブル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読みましょう
    • ほかにもリーダブルなテストを書く方法は色々あるので常に模索しましょう
122
112
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
122
112