インテグレーションテストをすこし早くする
環境
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秒くらいになったということになる。