WSL2で rails test:system を動かす

Railsで実際のブラウザを利用したテストを動作させる `test:system`を動作させるにはブラウザ関係の設定が必要になるので、以下にWSL2/Ubuntu18.04の場合の設定方法をまとめた。 ## 前提 - Railsはインストールして systemテスト以外は動いている前提。 - ubuntu18.04を利用。 - 20.04だと 2021/1/4時点で [fork() function is unimplemented on this machine (NotImplementedError) · Issue #5238 · microsoft/WSL](https://github.com/microsoft/WSL/issues/5238) のエラーが発生していたため - 2021//7/28で検索した限りでは解決法は見つからず。解消したら最新安定版の20.04にしたい。 ## 必要ライブラリのインストール Rails用意時点で入っているものもあるかもしれないが、このまま実行して問題無い。 ``` sudo apt update sudo apt install curl build-essential unzip wget ``` ## chromeのインストール test:systemが実装に動作するブラウザを用意する。 aptでもインストール可能だが、最新版を使うのが望ましい為、直接debをダウロードする。 ``` wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb -y ``` ## ~~chromedriverのインストール~~ **本項目は現在のバージョン(rails7.0.2.3で確認、Rails6でも同様と思われる)ではwebdrivers gemがやってくれるので必要ありません。履歴として残しています。** chromeをプログラムから操作するためのソフトウェア。chrome本体と違い、最新版が固定のURLでは無い為、一回最新版のversionを取得してからインストールする。 ``` export LATEST_VERSION=`curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE` wget https://chromedriver.storage.googleapis.com/$LATEST_VERSION/chromedriver_linux64.zip unzip chromedriver_linux64.zip sudo mv chromedriver /usr/local/bin/ rm -f chromedriver_linux64.zip ``` ## systemテストの設定 [System specを動かすのにはまった - Qiita](https://qiita.com/jhanyu/items/e2f467684873d806ad00) から引用。 headless(画面表示無し)で動作するよう設定する。 画面を表示したい場合はwindows側に X serverインストールの設定などが必要になるのでオススメしない。 headlessでもscreenshotは保存できるので、問題発生時はscreenshotで画面の確認は可能。 以下に設定例を書きます。動作実績のあるものを載せているのでminitest/rspecで等価ではありません。あくまで例として参照ください。 ### minitest 以下のクラスを作って `test_helper.rb`からrequireさせ、ApplicationSystemTestCase を各テストで使う。 ``` class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400] end ``` ### rspec rails_helper.rb (rails関係のtestをするファイルからrequireしておく) ``` Capybara.default_driver = :selenium_chrome_headless Capybara.register_driver :selenium_chrome_headless do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,1024') Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end ``` spec_helper.rb ``` config.before(:each, type: :system) do driven_by :selenium_chrome_headless end ```