ДжазТим — надежный технологический партнер

Agile разработка ПО на Java

Запуск Selenium-тестов на CircleCI при помощи Docker

Введение

Статья предназначена для людей знакомых с технологией Selenium, так как речь в статье пойдёт именно о запуске Selenium тестов на CI платформе CircleCI. Но для начала, давайте разберёмся с основными понятиями данной темы.

CI

Непрерывная интеграция (CI, Continuous Integration) — это практика разработки программного обеспечения, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.

Организация процессов CI

На выделенном сервере организуется служба (Job или джоба на нашем сленге), в задачи которой входят:

Сборки могут осуществляться:

Преимущества

Недостатки классических CI систем

Почему CircleCI?

Одно из ключевых отличий CircleCI от других CI — сборка билда происходит в облаке, то есть не нужна локальная билд-машина. Сервис позволяет гибко настраивать тестирование сборки, так как у пользователя есть доступ к sudo. Также существует локальная версия, которую можно развернуть в частном облаке.

CircleCI поддерживает следующие технологии:

Достоинства CircleCI

Недостатки CircleCI

Проект

В качестве примера воспользуемся тестовым проектом на node.js, который поставляется вместе с пакетом библиотек selenium-cucumber-js. Данный проект представляет собой связку Selenium + Cucumber, по сути, какие используются технологии — не важно, главное, чтобы проект работал на Selenium.

Чтобы запускать selenium тесты на удалённой CI есть несколько вариантов:

  1. Подключить виртуальный монитор, в котором будет отображаться браузер и можно будет наблюдать за прохождением тестов, подключившись к нему;
  2. Использовать Selenium Grid.

Мы будем использовать второй вариант, т.к. компоненты Selenium Grid очень легко можно настроить на CircleCI.

Настройка проекта

Для настройки необходимо немного модифицировать наш проект.

Конфигурация CircleCI

В корне проекта необходимо добавить новый каталог .circleci и создать в нём файл config.yml.

Ссылка на файл: https://github.com/JazzTeam/selenium-cucumber-js/blob/master/.circleci/config.yml

Проанализируем данный файл.

config.yml — является конфигурационным файлом CircleCI, в нём описывается окружение, различные команды и параметры запуска нашего приложения.

Docker

Docker

В разделе docker мы указываем докер-образы, которые хотим использовать, в нашем случае, это:

  1. circleci/node:7.10 — image, который представляет собой окружение для работы node.js приложений;
  2. selenium/standalone-chrome:3.11.0 — image, обеспечивающий работу Selenium Grid, подробнее читать тут: https://github.com/SeleniumHQ/docker-selenium
Steps

Steps

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

installation of components

Далее следуют три команды настройки Selenium Grid:

  1. create docker network — создаёт изолированную сеть grid для наших докер- контейнеров;
  2. install selenium-hub — запуск Selenium-хаба, внутри сети grid, с пробросом порта 4444 для подключения к нему нашего приложения во время запуска тестов;
  3. install selenium-node — запуск selenium-нода, внутри сети grid, и подключения его к ранее запущенному selenium-хабу.

Для просмотра итогов выполнения тестов по окончании выполнения джобы необходимо открыть степ — запуск контейнера Selenium-нода внутри сети grid с установленным и настроенным браузером Chrome.

Selenium

И в заключении две команды:

  1. install-npm — выкачивает все необходимые нашему приложению зависимости;
  2. run tests — запуск тестов.

Настройка проекта

Для того, чтобы наши тесты запускались не локально, а работали через Selenium-хаб, нужно модифицировать файл или, возможно, у вас это класс, который отвечает за конфигурацию web-драйвера.

В нашем случае, это будет файл — chromeDriver.js:

chromeDriver
Всё, что мы сделали, это указали, что web-драйвер должен использовать для запуска тестов внешний Selenium Hub, который в нашем случае доступен на localhost по проброшенному порту 4444 (установку и настройку хаба мы рассмотрели в предыдущем пункте).

GitHub

Наш тестовый проект готов, теперь его можно загрузить на github, так как говорилось ранее, что CircleCI имеет синхронизацию с github аккаунтами.

Давайте авторизируемся на github, создадим новый репозиторий и загрузим в него наш проект.

Вот ссылка на тестовый репозиторий: https://github.com/JazzTeam/selenium-cucumber-js

CircleCI

Перейдём на https://circleci.com/ и авторизируемся под тем же аккаунтом github-а.

CircleCI

Теперь перейдём в раздел ADD PROJECTS. Тут мы видим наш проект, который мы ранее залили на github. Выбираем операционную систему Linux и жмём кнопку Set Up Project нужного проекта.

CircleCI самостоятельно должна определить конфигурацию для нашего проекта. В зависимости от выбранной конфигурации, система сама сформирует нам конфигурационный файл для джобы. В пунктах с первого по четвёртый на скриншоте ниже описаны шаги по установке этого конфигурационного файла (мы проделали эти действия в пункте Конфигурация CircleCI).

На данной форме мы видим базовую конфигурацию проекта и шаги по установке конфиг-файла джобы:

Прокрутив ниже, мы видим пример конфиг-файл джобы, который был сгенерирован системой под нашу конфигурацию. Именно он был взят за основу конфига, который мы рассматривали ранее.

sample file

Далее запустим наши тесты, нажмём на кнопку Start Building.

Джоба запущена:

В реальном времени мы можем наблюдать процесс сборки проекта и запуска тестов, кликнув по любому из степов, мы увидим его логи.

Для просмотра итогов выполнения тестов, по окончанию выполнения джобы необходимо открыть степ run tests.

step run

Пример открытого степа run tests с логами пройденных тестов:

run tests

Теперь давайте посмотрим, как будут выглядеть поваленные тесты. Для этого изменим ожидаемый результат одного из тестов на заведомо ложный:

dropped tests

Данный тест реализован при помощи js фреймворка cucumber.js.

Как только мы закоммитаем наши изменения на github, будет автоматически инициирован новый билд по нашей джобе и он ожидаемо упадёт:

Давайте посмотрим на логи упавшего теста:

failed test logs

failed test logsВ логе мы чётко видим причины падения теста.

Заключение

CircleCI хорошо подходит для небольших проектов, в которых нужно запустить непрерывную интеграцию как можно скорее. Ввиду интеграции с GitHub подойдёт для opensource-проектов.

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

Какую CI выбрать вам, зависит от потребностей вашего проекта.

Удачи!

Вдохновлялся статьями:
https://djangostars.com/blog/continuous-integration-circleci-vs-travisci-vs-jenkins/
https://habr.com/post/264075/