技術系ブログ

とにかく小ネタで

【rails】Docker環境でSystemSpecの導入の仕方。

解決したのでまとめておきます。

導入前に

docker,rspec導入済みですすめます。 つまり単体テストはできるということです。

system導入するには

dockerコンテナの中へ新たにchromedriverを準備なければなりません。

実際に進めていきます。

gem

gem 'rails', '~> 5.1.0'
...
...
group :development, :test do
  gem "rspec-rails"
end

group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
end

Dockerfileに書き込む

FROM ruby:2.3.7

ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential node.js
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs
# chromeの追加
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
CMD ["rails", "server", "-b", "0.0.0.0"]

参考:Headless ChromeをDocker上で動かして、E2Eのテスト - Qiita
詳しくは、参考のリンク先見てください。 linuxコマンドをまとめておきます。

curl  HTTPアクセスをしてコンテンツを取得できるコマンド
wget HTTPアクセスをしてコンテンツをファイルに保存するコマンド
unzip ZIPファイルからファイルを取り出す

そのあとdocker-compose build

設定を書く。

mkdir spec/system;
mkdir spec/support; 
touch spec/support/capybara.rb
#spec/support/capybara.rb
require 'capybara/rspec'
require 'selenium-webdriver'

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-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')


  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :selenium_chrome_headless

・Capybaraにドライバを登録 ・Seleniumのoptionを指定する ・js使いたいときだけheadlessモードで起動する

#spec/rails_helper.rb

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
#↑コメントアウトする これによりspec/support/capybara.rbが読み込まれます。

RSpec.configure do |config|
  config.before(:each) do |example|
    if example.metadata[:type] == :system
      if example.metadata[:js]
        driven_by :selenium_chrome_headless, screen_size: [1400, 1400]
      else
        driven_by :rack_test
      end
    end
  end
end
#type: :systemのときのみchromeを使うという設定です。

テストの実行

spec/systemの下にテストファイルを作って書く。
docker-compose run web rspec spec

おしまい

参考:
RailsのSystemTest(headless chrome)をDocker上で動かす - Qiita
RailsのSystemTest(headless chrome)をDocker上で動かす - Qiita
Rails + Selenium + DockerでSystemSpecの環境構築 - Qiita