Railing against time: tools and techniques that got us 5X faster tests
最適化初歩
Sidekiqが提供するSidekiq::Testing のようなモジュールを作成しテスト時にはコールバックや実行を無効化するような機構を設ける RSpec metadata を利用して有効化・無効化
基本は向こうでタグがついた場合に有効化するなど
code:helper.rb
RSpec.configure do |config|
config.before(:each) do |example|
History::Testing.real!
else
History::Testing.fake!
end
end
end
これが一番効果的
FactoryBotの最適化
FPROF=flamegraph rspec のように利用することで無駄にレコードを作っていないか分析する
フレームグラフではレコードを多く作っていると高さが増す
https://test-prof.evilmartians.io/assets/factory-flame.gif
Database Truncate は
最適化とあまり関係ないが3rd party gemを使わずとも DB truncate が簡単にできるんだと知った
code:clean.rb
RSpec.configure do |config|
config.prepend_before(:suite) do
# Truncate all tables to make sure we start with a clean slate
ActiveRecord::Tasks::DatabaseTasks.truncate_all if ENV"CLEAN_DB" end
end
let it be ヘルパー
RD_PROF=1 rspec ... で実行すると let, let!, before(:each) で費やした時間を表示
FPROF=1 rspec ... で FacotryBot の分析を行い、let で宣言され多く実行される Factory を let_it_be ヘルパーに置き換える
効果はそこまででもない