遅すぎるfeatureテストに対して試したこと

Railsエンジニアの越川です。

よく、テストでRails.cacheを使ったテストをしたいけれども、テストの度に念のため消しておきたいという事情でspec/rails_helper.rb

  config.before(:each) do
    Rails.cache.clear
  end

このように書いていたりします。

このRails.cache.clearですが、cacheをdefaultのFileStoreにしていると、tmp/cacheの中身を消すようです。

この時、sassなどを使っているプロジェクトの場合、tmp/cache/assets/配下も一緒に消されてしまいます。これに気づかないとfeature specを実行するたびにsassのコンパイルが走ってしまい何故かfeature specがべらぼうに遅い!という自体が起きてしまいます。本格的にsassを使っているほど顕著です。

実際、poltergeistDriverに設定したfeature specが極端に遅いケースが有り、試しにレイアウトファイルからstylesheet_link_tagを消してみたところ、高速に実行できるようになったことから、cssのレンダリング、もしくはsassのコンパイルに時間がかかることを突き止めました。

簡単な解決策は、test時のcachememoryに変えることです。config/environments/test.rbを修正しましょう。

Rails.application.configure do
  config.cache_store = :memory_store
end

こうすることで、Rails.cache.clearの対象がtmp/cacheではなくなるので、tmp/cache/assets/が消えなくなります。

マネーフォワードでは日々テストを改善していきたいエンジニアを募集しています。
みなさまのご応募お待ちしております!

マネーフォワード採用サイト
https://recruit.moneyforward.com/

Wantedly
https://www.wantedly.com/companies/moneyforward

Pocket