Статьи

Тестирование вашего Rails-приложения с помощью Docker

В моей последней статье я показал вам, как перенести среду разработки Rails в Docker (и Docker Compose) . На этот раз я хочу подробнее остановиться на этом и обсудить некоторые улучшения, касающиеся тестирования вашего Rails-приложения.

Запуск базового набора тестов выполняется довольно легко. С настройкой из моего последнего поста вы можете просто запустить следующие команды, чтобы ускорить среду, создать и заполнить базу данных, и запустить свой набор тестов.

docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test

Это в основном то же самое, что вы выполняете свои тесты локально, и хотя это может немного ускорить тестирование (в зависимости от оборудования, на котором работает Docker), это не является значительным улучшением.

Но вы можете запустить тесты в нескольких контейнерах одновременно.

Проведение индивидуальных тестов

Как и в случае приложения, работающего локально, вы можете запустить отдельные тестовые наборы, указав имя файла в команде run .

docker-compose run -e "RAILS_ENV=test" app rspec spec/path/to/spec.rb

Выполнение тестов в параллельных контейнерах

Если ваш хост Docker достаточно мощный, вы также можете запускать свои тесты параллельно, используя несколько контейнеров. Доступны такие инструменты, как parallel_tests , которые позволяют вам параллельно выполнять тесты на одной машине; Вы также можете использовать их снова.

Тестирование браузера

Если вы хотите запускать тесты с помощью Capybara или аналогичного инструмента, вы можете просто расширить свой Dockerfile, включив в него необходимые браузеры, а также пакет xfvb , который предоставляет виртуальный сервер отображения.

...
# The Firefox package is called Iceweasel on Debian, but still provides the
# `firefox` binary.
RUN \
  DEBIAN_FRONTEND=noninteractive \
  apt-get install -y \
    chromium \
    iceweasel \
    xvfb
...

Включите веб-драйвер в свой Gemfile, и все готово. Я также рекомендовал бы взглянуть на драгоценный камень без головы , который предоставляет простую в использовании обертку вокруг xvfb и позволяет вам захватывать изображения или видео.

В качестве альтернативы вы можете переключиться на использование PhantomJS , который предоставляет безголовую версию WebKit и не требует никаких дополнительных пакетов. Установите его, добавив следующие команды в свой Dockerfile.

...
ENV PHANTOMJS_VERSION=1.9.8
RUN \
  cd /usr/local/share && \
  wget https://phantomjs.googlecode.com/files/phantomjs-${PHANTOMJS_VERSION}-linux-i686.tar.bz2 && \
  tar xvf phantomjs-${PHANTOMJS_VERSION}-linux-i686.tar.bz2 && \
  rm phantomjs-${PHANTOMJS_VERSION}-linux-i686.tar.bz2 && \
  ln -s /usr/local/share/phantomjs-${PHANTOMJS_VERSION}-linux-i686/bin/phantomjs /usr/local/bin/phantomjs

Примечание: мы используем версию 1.9.8 PhantomJS, потому что бинарные файлы Linux для версии 2 еще не доступны. Если вы хотите использовать версию 2, вам нужно скомпилировать ее самостоятельно, но затем вы можете использовать приведенную выше команду для ее загрузки и установки.

Выполнение зависимостей разработки / тестирования только

Если вам требуются зависимости, которые должны работать только в вашей тестовой среде или среде, вы можете довольно легко добавить новое определение контейнера в docker-compose.yml и соответствующим образом адаптировать свою конфигурацию.

Например, Discourse использует Mailcatcher во время разработки. При традиционной установке вам потребуется установить программное обеспечение на компьютер для разработки. Тем не менее, это становится еще проще с контейнерной настройкой.

Адаптируйте определение вашего приложения, как описано ниже ( конфигурация development.rb уже включает в себя конфигурацию для отправки почты через порт, определенный Mailcatcher, так что вам вообще не нужно его менять).

app:
  ...
  links:
    ...
    - mailcatcher
...
mailcatcher:
  image: schickling/mailcatcher
  ports:
    - "1080:1080"

После перезапуска среды вы можете открыть веб-интерфейс Mailcatcher по IP-адресу вашего хоста Docker и просмотреть любую почту, отправленную через ваше приложение.

Докер по кодексу

Как я уже упоминал в своем предыдущем посте , Codeship в настоящее время также готовит инфраструктуру CI на основе Docker. Мы будем использовать Docker Compose (с некоторыми расширениями) для определения вашей тестовой среды, а затем будем иметь отдельную конфигурацию на основе YAML для настройки того, какие шаги нужно выполнить.

Платформа все еще находится в стадии разработки, поэтому доступные параметры не определены, но следующая конфигурация будет запускать различные тесты для нескольких контейнеров для хранилища Discourse .

# codeship-services.yml
app:
  build:
    image: codeship/discourse
    dockerfile_path: Dockerfile
  environment:
    RAILS_ENV: test
  links:
    - postgresql
    - redis
  volumes_from:
    - data
postgresql:
  image: postgres:9.4
redis:
  image: redis:3.0
data:
  image: busybox
  volumes:
    - /data

В сочетании со следующим определением шага мы будем запускать ваши тесты в трех контейнерах Docker параллельно.

# codeship-steps.yml
- type: parallel
  service: app
  steps:
    - command: bundle exec rspec
    - command: bundle exec rake plugin:spec
    - command: bundle exec rake qunit:test

Отправляйтесь в Codeship Docker Beta, чтобы подписаться на бета-версию.