症状
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