Учебное руководство по интеграционному тестированию с помощью Bitbucket Pipelines

Узнайте, как с помощью Bitbucket Pipelines запускать интеграционные тесты для конвейера со множеством сервисов, работающих в отдельных контейнерах Docker.

Sten Pittet Sten Pittet

Тестирование является важнейшей частью непрерывной интеграции и непрерывной поставки. А если вы практикуете непрерывное развертывание, тестирование будет последней линией защиты от багов перед выпуском изменений клиентам. Модульные тесты, проверяющие отдельные методы и классы, являются отличным средством для первичного предотвращения проблем, но в дополнение к ним необходимо выполнять интеграционные тесты, которые обеспечивают правильное взаимодействие различных модулей приложения (сервера приложений, базы данных, кэша). В этом учебном руководстве будет показано, как с помощью Bitbucket Pipelines запускать интеграционные тесты для конвейера со множеством сервисов, работающих в отдельных контейнерах Docker.

Требования

Шаг 1. Запуск образца приложения локально

Мы будем использовать простое приложение Node.js, которое отображает сообщение на домашней странице и регистрирует посещения в базе данных. Чтобы сосредоточить внимание на конфигурации Bitbucket Pipelines, можно просто клонировать приложение из терминала.

git clone git@bitbucket.org:spittet/bitbucket-pipelines-services-tutorial.git

Теперь перейдите в локальный репозиторий и выполните команду npm install, чтобы установить зависимости, требуемые приложением.

cd bitbucket-pipelines-services-tutorial/ npm install

Перед запуском приложения потребуется запустить новый экземпляр MongoDB. Благодаря Docker это просто сделать из терминала.

docker run --name mongodb -d -p 27017:27017 mongo

Затем запустите ваше приложение и перейдите по адресу http://localhost:3000 , чтобы увидеть его в действии.

npm start

Можно перейти по адресу http://localhost:3000/visits и убедиться, что посещение было корректно зарегистрировано в базе данных.

И наконец, давайте с помощью команды npm test убедимся в том, что в локальной среде тесты проходят успешно. Выполнение этой команды запускает два теста.

npm test

Этот образец приложения выполняет два разных теста.

  • Один тест, который проверяет, отображает ли приложение сообщение Hello World на главной странице.
  • Один тест, который убедится, что каждый раз, когда кто-либо обращается к домашней странице, в базе данных регистрируется новое посещение.

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

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

Шаг 2. Автоматическое выполнение тестов с помощью Bitbucket Pipelines

Начните с создания нового репозитория в своем аккаунте Bitbucket и измените удаленный URL-адрес для origin так, чтобы он указывал на ваш репозиторий Bitbucket.

git remote set-url origin git@bitbucket.org:<my account>/<my repository>.git git push origin main 

Чтобы включить Bitbucket Pipelines, перейдите в раздел «Pipelines» в репозитории.

Можно использовать стандартный шаблон Javascript, приведенный на следующем экране. В нем уже будут команды npm install и npm test, которые необходимы для установки зависимостей и запуска комплекта тестов.

Ничего не меняя в конфигурации YML, выполните коммит вашего файла bitbucket-pipelines.yml. Сервис базы данных отсутствует, но мы добавим его позже.

После того, как вы выполните коммит своего файла, вы будете перенаправлены в раздел Pipelines своего репозитория, где увидите первый конвейер в процессе работы. Работа конвейера будет завершена неудачно, потому что второй тест не сможет корректно выполниться без подключения к базе данных. Если вы перейдете к своему конвейеру, то увидите экран, похожий на показанный ниже, где будет написано, что 1 тест пройден и 1 тест завершен неудачно.

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

Шаг 3. Добавление определения сервиса для базы данных

Используя Bitbucket Pipelines, помимо основного приложения, выполняемого в конвейере, можно запускать до трех дополнительных контейнеров Docker. Эти контейнеры можно использовать для запуска таких сервисов, как хранилище данных или инструмент аналитики, а также любого стороннего сервиса, который может понадобиться вашему приложению для прохождения всех этапов конвейера. В нашем случае мы будем использовать отдельный сервисный контейнер для запуска MongoDB.

Перейдите в раздел исходного кода в репозитории для просмотра списка файлов.

Щелкните файл конфигурации bitbucket-pipelines.yml, чтобы получить к нему доступ. В правом верхнем углу вы найдете кнопку Edit (Редактировать), которая позволит вам отредактировать файл и сделать коммит прямо из браузера.

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

bitbucket-pipelines.yml

# This is a sample build configuration for Javascript (Node.js). # Check our guides at https://confluence.atlassian.com/x/14UWN for more examples. # Only use spaces to indent your .yml configuration. # ----- # You can specify a custom docker image from Docker Hub as your build environment. image: node:4.6.0   pipelines:   default:     - step:         script: # Modify the commands below to build your repository.           - npm install           - npm test definitions:   services:     database:       image: mongo  

При использовании MongoDB не нужны какие-либо дополнительные настройки в определении образа, но в случае с некоторыми образами Docker для хранилищ данных и сервисов может потребоваться указать отдельные переменные среды. Список примеров для баз данных можно найти в документации Bitbucket Pipelines.

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

bitbucket-pipelines.yml

# This is a sample build configuration for Javascript (Node.js). # Check our guides at https://confluence.atlassian.com/x/14UWN for more examples. # Only use spaces to indent your .yml configuration. # ----- # You can specify a custom docker image from Docker Hub as your build environment. image: node:4.6.0   pipelines:   default:     - step:         script: # Modify the commands below to build your repository.           - npm install           - npm test         services:           - database definitions:   services:     database:       image: mongo

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

Если щелкнуть по вкладке database (база данных) в панели журналов, можно увидеть журналы контейнера MongoDB.

Вот и все! Теперь вы знаете, как добавлять сервисы в конвейер для запуска интеграционных тестов. Не забудьте ознакомиться с документацией, чтобы узнать больше о способах использования этих сервисов.