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
```
ブログ