[RUBY] Utilisez le docker au sélénium pour les spécifications du système CircleCI

Ceci est mon premier message, alors jetez un œil à toute erreur ou chose déroutante.

environnement

・ Rubis 2.7.1 ・ Rails 6.0.2.1

Chose que tu veux faire

・ Exécutez le test du système en utilisant le docker de sélnium dans CircleCI -Make system js: true disponible dans CircleCI

docker-compose.yml Obtenez l'image du sélénium à utiliser dans les spécifications du système, et n'oubliez pas de spécifier le port et la coopération avec depens_on.

docker-compose.yml


version: "3"
services:
  web:
    build: .
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    depends_on:
      - db
      - chrome
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABE: db
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
  chrome:
    image: selenium/standalone-chrome-debug:latest
    ports:
      - "4444:4444"
volumes:
  mysql-data:
    driver: local

Modifier database.yml

En l'état, le conteneur db ne sera pas utilisé pour la base de données, donc modifiez database.yml.

database.yml


default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myappp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
$ docker-compose build
$ docker-compose up
$ docker-compose run web rake db:create

spec/rails_helper Ajoutez les gemmes nécessaires aux tests

Gemfile


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

le test du système modifie rails_spec pour utiliser le docker sélénium

rails_spec.rb


Capybara.register_driver :remote_chrome do |app|
  url = 'http://chrome:4444/wd/hub'
  caps = ::Selenium::WebDriver::Remote::Capabilities.chrome(
    'goog:chromeOptions' => {
      'args' => [
        'no-sandbox',
        'headless',
        'disable-gpu',
        'window-size=1680,1050'
      ]
    }
  )
  Capybara::Selenium::Driver.new(app, browser: :remote, url: url, desired_capabilities: caps)
end

RSpec.configure do |config|
  #réduction

  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :remote_chrome
    Capybara.server_host = IPSocket.getaddress(Socket.gethostname)
    Capybara.server_port = 4444
    Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
  end
end

Les spécifications du système local devraient maintenant fonctionner correctement

.circleci/config.yml Paramètres Circle CI --run: mv ./config/database.yml.ci ./config/database.yml modifie les paramètres de la base de données dans l'environnement CI. Vous devez définir le nom: chrome ʻErrno :: EADDRINUSE: Adresse déjà utilisée --bind (2) pour le port 4444 "172.27.0.3" Une erreur se produit

config.yml


version: 2.1
jobs:
  build:
    docker:
      - image: circleci/ruby:2.7.1-node-browsers
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
      - image: mysql:8.0
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
          MYSQL_ROOT_HOST: "127.0.0.1"
          MYSQL_DATABE: db
        command: --default-authentication-plugin=mysql_native_password
      - image: selenium/standalone-chrome-debug:latest
        name: chrome
    working_directory: ~/coffee
    steps:
      - checkout
      - run:
          name:Installer le bundle
          command: bundle check || bundle install --jobs=4
      - run:
          name:Ajouter du fil
          command: yarn install
      - run:
          name:Ajouter un pack Web
          command: bundle exec bin/webpack
      - run:
          name: rubocop
          command: bundle exec rubocop
      - run: mv ./config/database.yml.ci ./config/database.yml
      - run:
          name:Créer une base de données
          command: bundle exec rails db:create || bundle exec rails db:migrate
      - run:
          name: rspec test
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
              circleci tests split --split-by=timings)"
            bundle exec rspec \
              --format RspecJunitFormatter \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

Le test du système rspec sur CircleCI devrait maintenant fonctionner correctement

référence

Recommended Posts

Utilisez le docker au sélénium pour les spécifications du système CircleCI
Utiliser Puphpeteer avec Docker