CarrierWave 利用時に RSpec の実行速度を高速化できるかもしれないたった一つの設定

CarrierWave、便利ですよね!
ファイルアップロードの定番なので、僕もよく利用しています。
ただ、場合によっては RSpec の実行速度を著しく下げる場合があるので、その改善法のご紹介。

とあるプロジェクトで実験してたのですが、もともと 15分 程度かかっていた spec の実行時間がこの設定だけで 7分 程度に削減されました!

高速化できるかもしれない場合

以下の条件に当てはまる場合、高速化できる可能性があります。

  1. CarrierWave を使っていて
  2. Uploader で画像のリサイズとかを行っていて
  3. FactoryGirl とかで Uploader がマウントされてる要素に画像をセットしてる場合

高速化するための魔法の言葉

既にお気づきの方もいらっしゃると思いますが、何も設定しないとテストの時も画像のリサイズとかが走ってるんですよね。
大抵の場合、spec 実行する際はリサイズされた画像なんて必要ない事が多いです。
ということはリサイズをしなくするだけで spec の実行速度があがるのでは!

というわけで、initializer で以下のような設定を追加しましょう。

CarrierWave.configure do |config|
  ....
  config.enable_processing = false if Rails.env.test?
  ....
end

効果のほどは

画像のリサイズを3種類ほど行ってるモデルで実験した所、以下の様な感じでした。

使ったコマンド

Benchmark.measure { 100.times { FactoryGirl.create(:profile) } }

結果

user system total real
before 10.230000 3.600000 28.620000 ( 41.236512)
after 8.640000 0.440000 9.080000 ( 9.847417)

ざっくりですけど、実行時間が 25% 程度になってます!

まとめ

今回の例だと対象のモデルがユーザのプロフィール関係だったので、それらを利用しまくっていた Feature spec が相当高速化されました。
プロフィール画像が必須で FacotyGirl で画像を設定している場合とかだと効果が顕著に出ると思うので、まだこの設定をしてない方は是非お試しあれ!

参考https://github.com/carrierwaveuploader/carrierwave#testing-with-carrierwave