RailsのSystem specで Net::ReadTimeout が発生する

症状

RailsのSystem specを実行すると、以下のエラーで spec が失敗する

     Net::ReadTimeout:
       Net::ReadTimeout with #<TCPSocket:(closed)>
  • ローカル環境では最初のテスト実行時だけ発生する。2回目から発生しなくなる。
  • CI環境でたまにランダムで発生する。

原因

どうやらassetsのコンパイルに時間がかかっているためにSeleniumがタイムアウトしているようだった。(確かにこのサイトはassetsのscss, javascriptが巨大で、最初のアクセスにかなりの時間がかかっていた)

ローカル環境では一度assetsがコンパイルされていればキャッシュがあるため1度だけ発生していたようだ。

CI環境では以下の記事と同様に事前にassets:precompileすることで解決した。
https://jtway.co/4-lines-to-speed-up-your-rails-test-suite-on-ci-744e4326e8a3

# config/environments/test.rb
Rails.application.configure do
  :
  if ENV['CI']
    config.assets.digest = true
    config.assets.debug = false
    config.assets.compile = false
    config.assets.js_compressor = Uglifier.new(harmony: true)
  end
end
# .circleci/conf.yml
    :
    steps:
    :
    - restore_cache:
        keys:
          - asset-cache-{{ arch }}-{{ .Branch }}
          - asset-cache-
    - run: bundle exec rails assets:precompile
    - save_cache:
        key: asset-cache-{{ arch }}-{{ .Branch }}-{{ epoch }}
        paths:
          - public/assets
          - public/packs
          - tmp/cache/assets/sprockets