WSL環境上(Ubuntu 18.04 LTS使用)でRails 6.0のシステムテスト(rails test:system
)を行うと、一部がエラーになります。
エラーの詳細
全てがエラーになるのではなく、最初の1個または2個のみ成功します。実行する度に成功する個数は変わります。また、テストを一つだけした場合は必ず成功します。全てのテストについて、一つだけの状態で成功することを確認しており、テスト自体に問題はないと思われます。
エラーメッセージは下記のものが1~3個表示されます。
Error: MemosTest#test_updating_a_Memo: Selenium::WebDriver::Error::InvalidSessionIdError: invalid session id
テスト環境の構築方法と設定
テスト環境は以下のようにして構築しました。あらかじめRuby(rbenv)、Node.js(nodenv)、Yarn(公式レポジトリ)の最新版を入れており、また、build-essentialやlibsqlite3-dev等のパッケージも入れた状態です。
gem install rails rails new test_app cd test_app bundle install bundle yarn:install rails generate scaffold Memo title:string:index content:text rails db:create rails db:migrate rails test rails server
この時点で、 http://localhost:3000/memos にアクセスして、Memoの作成や閲覧等ができることを確認しています。
システムテストのためのchromium-chromedriverをいれます。
suda apt install chromium-chromedriver
システムテストを実施してみます。
rails test:system
デフォルトのままではChromeの起動自体がクラッシュして下記エラーが発生します。
Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: crashed
そこでtest/application_system_test_case.rb
を下記のように書き換えます。
require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400] do |driver_option| driver_option.add_argument('no-sandbox') driver_option.add_argument('disable-gpu') driver_option.add_argument('disable-features=VizDisplayCompositor') end end
【注意】この書き方はRails 6.0から可能になった書き方で、Rails 5.xではこの書き方はできません。今回試したchromiumではdisable-gpu
オプションは無くても大丈夫なようですが、付けています。逆にdisable-features=VizDisplayCompositor
は必須です。なお、ドライバーへのオプションは--
があってもなくても良いようです。
改めてrails test:system
を実行すると、
4 runs, 2 assertions, 0 failures, 3 errors, 0 skips
テスト4つのうち3つがエラーになり、成功は1つのみです。なお、成功が2つになるときもありました。chromium自体はうまく起動するときがあるようです。
試したこと
窓サイズが大きすぎるとメモリ不足で失敗するという情報があったため、次のように800x600にしてみました。
require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :headless_chrome, screen_size: [800, 600] do |driver_option| driver_option.add_argument('no-sandbox') driver_option.add_argument('disable-gpu') driver_option.add_argument('disable-features=VizDisplayCompositor') end end
しかし、現象は変わらず、エラーが発生します。そもそもメモリは10GB以上空いてますので、関係なさそうです。(CI等メモリが限られている環境では有効のようですが)
なお、driven_by
の引数では無く、driver_option.add_argument('window-size=800,600')
とドライバーオプションとして窓サイズを指定しても変わりはありませんでした。
まだ試してないこと
Vagrant(with Hyper-V)で作った(GUI環境が入っていない)Ubuntu 18.04 LTSではどうなのか試そうとしましたが、IPv6の所為でパッケージが落ちてこず、ちょっと環境構築に手間取っています。既にRails 6.0でうまくいったという人がいれば教えてください。その他、docker上とかはまだ試していないです。なので、WSL特有なのかはよくわかっていません。
環境
OS: Windows 10 Pro 1903
WSL上のLinux: Ubuntu 18.04.3 LTS
Ruby: 2.6.5 (rbenv install経由)
Node.js: 12.11.1 (nodenv install経由)
Yarn: 1.19.1 (apt経由1.19.1-11)
Ruby on Rails: 6.0.0 (gem経由)
Chromium: 77.0.3865.90 (apt経由77.0.3865.90-0ubuntu0.18.04.1)
ChromDriver: 77.0.3865.90 (apt経由77.0.3865.90-0ubuntu0.18.04.1)
Ubuntu全体のアップデート日: 2019年10月12日
あなたの回答
tips
プレビュー