はじめに
私はエンジニアインターンで主にサーバーサイドの開発を担当させていただいています。
機能実装の際はRSpecでテストケースを書いてから実装していて、コミットする前に全体のテストを通してバグを見つけているのですが
実行時間が長い!
ということで、RSpecのリファクタリングを行いテストの実行時間を削減して見ましたので、一部紹介したいと思います。
1. 従来のRSpecでのデータリクエスト状況
現状、RSpecでは以下のように、let
を使用してデータの作成を行っています。
require 'spec_helper'
describe User do
let!(:user) { FactoryBot.create(:user) }
it 'anything' do
# userのテスト
end
it 'anything' do
# userのテスト
end
it 'anything' do
# userのテスト
end
end
これではexampleが3回行われる度にUser
モデルが作成されてしまう。
これをどうにか1回のレコード作成に留められないか...
2. gem "test-prof"の導入
そこでtest-prof
を導入します。
Gemfile
gem "test-prof"
bundle install
変更後テストケース
require 'spec_helper'
describe User do
let_it_be(:user) { FactoryBot.create(:user) }
it 'anything' do
# userのテスト
end
it 'anything' do
# userのテスト
end
it 'anything' do
# userのテスト
end
end
このようにtest-profはlet_it_be
というヘルパーメソッドを提供してくれるgemになります。
そうするとRailsのトランザクションテスト機能を利用してレコードを最初に1回だけ作成して、テストが終了したら該当データを削除してくれるようになります。
3. ベンチマーク
変更したテストファイル数は全体の3割ほどですが、約1分のテスト実行時間の削減に繋がりました。
let_it_be使用前
let_it_be使用後
おわりに
画期的にテストの実行時間を削減できた訳ではありませんが、長期的に見て効果のある対処法なのではないかと思います。
参考