Запуск Selenium-тестов на CircleCI при помощи Docker
Введение
Статья предназначена для людей знакомых с технологией Selenium, так как речь в статье пойдёт именно о запуске Selenium тестов на CI платформе CircleCI. Но для начала, давайте разберёмся с основными понятиями данной темы.
CI
Непрерывная интеграция (CI, Continuous Integration) — это практика разработки программного обеспечения, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.
Организация процессов CI
На выделенном сервере организуется служба (Job или джоба на нашем сленге), в задачи которой входят:
- получение исходного кода из репозитория;
- сборка проекта;
- выполнение тестов;
- развёртывание готового проекта;
- отправка отчетов.
Сборки могут осуществляться:
- по запросу;
- по расписанию;
- по факту обновления.
Преимущества
- автоматический и регулярный прогон unit-тестов;
- наличие стабильной версии для демонстрации и тестирования;
- быстрое выявление последствий некачественного кода.
Недостатки классических CI систем
- необходимость в выделенном сервере;
- затраты на поддержку.
Почему CircleCI?
Одно из ключевых отличий CircleCI от других CI — сборка билда происходит в облаке, то есть не нужна локальная билд-машина. Сервис позволяет гибко настраивать тестирование сборки, так как у пользователя есть доступ к sudo. Также существует локальная версия, которую можно развернуть в частном облаке.CircleCI поддерживает следующие технологии:
- Python, Node.js, Ruby, Java, Go и т. д.;
- Ubuntu (12.04, 14.04), Mac OS X (платные аккаунты);
- Github, Bitbucket;
- AWS, Azure, Heroku, Docker, выделенный сервер;
- Jira, HipChat, Slack.
Достоинства CircleCI
- легкое и быстрое начало работы;
- бесплатная версия для коммерческого использования;
- небольшие и легко читаемые файлы конфигурации в формате YAML;
- отсутствие необходимости в выделенном сервере CircleCI.
Недостатки CircleCI
- CircleCI в бесплатной версии поддерживает только Ubuntu версий 12.04 и 14.04. Использование MacOS является платной услугой;
- несмотря на то, что CircleCI может работать с любыми языками программирования, из коробки поддерживаются только Go (Golang), Haskell, Java, PHP, Python, Ruby/Rails, Scala;
- при желании подстроить систему под себя в некоторых случаях могут возникнуть проблемы, и тогда для достижения цели понадобится стороннее программное обеспечение.
Проект
В качестве примера воспользуемся тестовым проектом на node.js, который поставляется вместе с пакетом библиотек selenium-cucumber-js. Данный проект представляет собой связку Selenium + Cucumber, по сути, какие используются технологии — не важно, главное, чтобы проект работал на Selenium.Чтобы запускать selenium тесты на удалённой CI есть несколько вариантов:
- Подключить виртуальный монитор, в котором будет отображаться браузер и можно будет наблюдать за прохождением тестов, подключившись к нему;
- Использовать 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 мы указываем докер-образы, которые хотим использовать, в нашем случае, это:
- circleci/node:7.10 — image, который представляет собой окружение для работы node.js приложений;
- selenium/standalone-chrome:3.11.0 — image, обеспечивающий работу Selenium Grid, подробнее читать тут: https://github.com/SeleniumHQ/docker-selenium
Steps
Данный кусок кода сгенерирован автоматически, по сути, тут происходит заключительная настройка окружения, установка компонентов.
Далее следуют три команды настройки Selenium Grid:
- create docker network — создаёт изолированную сеть grid для наших докер- контейнеров;
- install selenium-hub — запуск Selenium-хаба, внутри сети grid, с пробросом порта 4444 для подключения к нему нашего приложения во время запуска тестов;
- install selenium-node — запуск selenium-нода, внутри сети grid, и подключения его к ранее запущенному selenium-хабу.
Для просмотра итогов выполнения тестов по окончании выполнения джобы необходимо открыть степ — запуск контейнера Selenium-нода внутри сети grid с установленным и настроенным браузером Chrome.
И в заключении две команды:
- install-npm — выкачивает все необходимые нашему приложению зависимости;
- run tests — запуск тестов.
Настройка проекта
Для того, чтобы наши тесты запускались не локально, а работали через Selenium-хаб, нужно модифицировать файл или, возможно, у вас это класс, который отвечает за конфигурацию web-драйвера.
В нашем случае, это будет файл — chromeDriver.js:
Всё, что мы сделали, это указали, что web-драйвер должен использовать для запуска тестов внешний Selenium Hub, который в нашем случае доступен на localhost по проброшенному порту 4444 (установку и настройку хаба мы рассмотрели в предыдущем пункте).
GitHub
Наш тестовый проект готов, теперь его можно загрузить на github, так как говорилось ранее, что CircleCI имеет синхронизацию с github аккаунтами.Давайте авторизируемся на github, создадим новый репозиторий и загрузим в него наш проект.
Вот ссылка на тестовый репозиторий: https://github.com/JazzTeam/selenium-cucumber-js
CircleCI
Перейдём на https://circleci.com/ и авторизируемся под тем же аккаунтом github-а.Теперь перейдём в раздел ADD PROJECTS. Тут мы видим наш проект, который мы ранее залили на github. Выбираем операционную систему Linux и жмём кнопку Set Up Project нужного проекта.
CircleCI самостоятельно должна определить конфигурацию для нашего проекта. В зависимости от выбранной конфигурации, система сама сформирует нам конфигурационный файл для джобы. В пунктах с первого по четвёртый на скриншоте ниже описаны шаги по установке этого конфигурационного файла (мы проделали эти действия в пункте Конфигурация CircleCI).
На данной форме мы видим базовую конфигурацию проекта и шаги по установке конфиг-файла джобы:
Прокрутив ниже, мы видим пример конфиг-файл джобы, который был сгенерирован системой под нашу конфигурацию. Именно он был взят за основу конфига, который мы рассматривали ранее.
Далее запустим наши тесты, нажмём на кнопку Start Building.
Джоба запущена:
В реальном времени мы можем наблюдать процесс сборки проекта и запуска тестов, кликнув по любому из степов, мы увидим его логи.
Для просмотра итогов выполнения тестов, по окончанию выполнения джобы необходимо открыть степ run tests.
Пример открытого степа run tests с логами пройденных тестов:
Теперь давайте посмотрим, как будут выглядеть поваленные тесты. Для этого изменим ожидаемый результат одного из тестов на заведомо ложный:
Данный тест реализован при помощи js фреймворка cucumber.js.
Как только мы закоммитаем наши изменения на github, будет автоматически инициирован новый билд по нашей джобе и он ожидаемо упадёт:
Давайте посмотрим на логи упавшего теста:
В логе мы чётко видим причины падения теста.
Заключение
CircleCI хорошо подходит для небольших проектов, в которых нужно запустить непрерывную интеграцию как можно скорее. Ввиду интеграции с GitHub подойдёт для opensource-проектов.Jenkins и ему подобные системы, я рекомендую к применению на крупных проектах, где требуется серьёзная настройка окружения. В Jenkins можно настроить что угодно при помощи плагинов, но на это потребуется много времени.
Какую CI выбрать вам, зависит от потребностей вашего проекта.
Удачи!
Вдохновлялся статьями:
https://djangostars.com/blog/continuous-integration-circleci-vs-travisci-vs-jenkins/
https://habr.com/post/264075/