【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