rails の system test を docker で動かす


概要

rails の system test は chrome などのブラウザが必要なので、docker で動かすにはひと手間必要です。

selenium が公開している image を使うと Dockerfile で chrome のインストールなどをせずとも system test を動かすことができます。

docker-compose.yml

こんな感じになります。

selenium の ports は指定しなくてもテスト自体は動きますが、テストの様子をブラウザで閲覧したいので指定しています。

services:
  rails:
    image: ruby
    command: sh -c "rm -f tmp/pids/server.pid && ./bin/rails s"
    depends_on:
      - selenium
    environment:
      BINDING: 0.0.0.0
      LANG: C.UTF-8
    ports:
      - "3000:3000"
    tty: true
    volumes:
      - .:/workspace
      - gem-data:/usr/local/bundle
    working_dir: /workspace
  selenium:
    image: selenium/standalone-chrome
    ports:
      - "7900:7900"

volumes:
  gem-data:

Gemfile

Gemfile から webdrivers を削除します。

webdrivers を require していると、インストールされている chrome を探すのでエラーになってしまいます。

今回は remote の selenium と連携する方針なので webdrivers は不要です。

- gem "webdrivers"

test/application_system_test_case.rb

selenium を使うための設定を追加します。

url の host は docker-compose.yml の service 名です。

Capybara.server_host はデフォルトだと 127.0.0.1 ですが、それだと接続が上手くいきません。

環境変数 HOSTNAME の値を指定してあげると上手く接続できるようになります。

driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: {
  browser: :remote,
  url: 'http://selenium:4444'
}

Capybara.server_host = ENV.fetch('HOSTNAME')