RSpec の it { … } と速度の話

  • 42
    Like
  • 0
    Comment
More than 1 year has passed since last update.

TDD, BDD にはテストを実行する速度がすごい重要なのはみんな知っていると思うけど、
it { … } 記法が速度にどう影響するか知ってる? という話。

場合によっては、 subject + it, its で何行も並べるより、まとめられるなら 1 つの example にまとめたほうが速いです。

# May be slow
describe 'foo' do
  subject { get :foo }
  before do
    # Prepare the model (e.g. FactoryGirl)
  end

  it { should be_ok }
  its(:body) { should match(/foo/) }
  # ...

  after do
    # Clear the DB (e.g. DatabaseCleaner)
  end
end

前提

  • before や let! でたくさんモデルをつくったり、前準備としていろいろしてる
  • after で DatabaseCleaner 等を利用して DB を example 毎にけしている

なぜか

  • it や its 毎に before(:each) と after(:each) が走るため。
  • 結構いろんなモデルとレコードの数が絡むコントローラテスト等だと速度に結構響いてくる事がある。

なので

無理に it { should … } などと一行にせずに、まとめられる適切な粒度で同じ example にすると早くなるかもしれません。

rspec のああいったシンプルな記法は便利ですが実はそれを使うことによって読みにくくなったり、このような形で速度に影響してくるので使わないという選択肢も考えるとよさそう。

describe 'foo' do
  subject { get :foo }
  before do
    # Prepare the model (e.g. FactoryGirl)
  end

  it "renders 'foo'" do
    should be_ok
    subject.body.should match(/foo/)
  end

  after do
    # Clear the DB (e.g. DatabaseCleaner)
  end
end

(NOTE: its が deprecated な風潮なのは知っていますが、今回は事例として紹介しやすいのでつかいました。)