インテグレーションテストをすこし早くする

環境

rack-test (0.6.2)
poltergeist (1.5.0)

テスト遅いのなんとかしたくて試験毎に呼ばれるログイン処理なんとかならんかみたいの考えた結果、ドライバーのAPIを直接叩くようにしてみた。

ちなみに、ログイン処理はspec_helper.rbに書いてどのテストからでも呼べるようにしてる。

# spec/spec_helper.rb
RSpec.configure do |config|
  config.include LoginHelpe
end

変更前

capybaraから普通にログイン操作をしてる。

  def admin_login
    admin = find_admin_or_create
    visit admin_login_path
    fill_in 'username', with: admin.username
    fill_in 'password', with: USER_PASSWORD
    click_button 'サインイン'
  end

変更後

RackTestドライバーの時だけ、RackTestのAPIを使ってを直接リクエストを投げるようにする。
Poltergeistが動いている場合は今まで通り画面からポチポチしてる。(ソースをざっと見た感じ直接リクエストを投げるAPIはなかったっぽい。)

def admin_login
  admin = find_admin_or_create
  if page.driver.is_a?(Capybara::RackTest::Driver)
      page.driver.post(admin_sessions_url,
                       username: admin.username,
                       password: USER_PASSWORD)
    visit admin_root_path # 認証後は遷移はしないため
else
  visit admin_login_path
  fill_in 'username', with: admin.username
  fill_in 'password', with: USER_PASSWORD
  click_button 'サインイン' 
end

時間を測定する

Benchmark.realtimeを使って、それぞれログイン処理にかかった時間を測る。

p Benchmark.realtime { .......... }

結果(秒)

"Poltergiestの場合です"
0.443015
"RackTestの場合です"
0.222489

波はあるけどだいたい半分になりました!

早くなった時間

とあるRailsアプリでこのadmin_loginを使っていたのは79個のテストがあって、そのうち5個はPoltergeistを使っていた。
全テストのログイン処理に30秒くらいかかってたのが15秒くらいになったということになる。