Протестируйте свои API с помощью MockServer, как настоящий сервис

Системная интеграция неизбежна при разработке приложений. Независимо от того, является ли ваша система набором современных микросервисов или устаревшей монолитной системой, большая часть системной логики зависит от других процессов или источников данных для обеспечения значимых бизнес-функций. Интеграция будет в форме вызовов библиотечных функций или вызовов REST API. Взаимодействие с другими компонентами часто является головной болью, особенно когда ваши аналоги недоступны для тестирования во время разработки системы. Это ограничение для обеспечения качества логики интерфейса. В результате на более поздней стадии цикла разработки будет обнаружен ряд системных ошибок, которые, возможно, помешают процессу доставки системы.

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

Например, люди построили адаптер в компоненте интерфейса, который считывает ответы с фиктивными данными из «автономного» файла. Такой адаптер не является фиктивной заглушкой, разработка - это трудоемкая и утомительная задача, поскольку он содержит логику, которая анализирует сообщения в частном формате и распознает тип запроса, затем выполняет поиск и возвращает соответствующие фиктивные ответы. Это было обычной практикой в ​​банковской отрасли, поскольку базовая банковская система AS / 400 или мэйнфрейм не всегда доступны для тестирования с помощью банковского портала.

В настоящее время повсеместное использование фреймворка тестирования и инструментов имитации помогает нам легче справляться с издевательством с меньшими усилиями. В сочетании с такими утилитами разработки, как Maven, можно автоматизировать большинство тестов, что значительно ускоряет процесс разработки и тестирования. В этой статье я расскажу, как интегрировать MockServer и автоматизировать модульные и интеграционные тесты для разработки Java Spring Boot API.

Что такое MockServer?

Вам нужна фиктивная служба REST API для проверки функциональности вашей системы и логики интеграции на протяжении всего цикла разработки. Однако внешние сервисы могут быть недоступны, обычно это происходит, если внешние сервисы разрабатываются параллельно. MockServer - полезный инструмент, который предлагает простой способ имитировать любые службы REST API. Он предлагает удобные для разработчиков функции, такие как плагин maven и аннотации для тестирования конфигурации. Кроме того, он поддерживает определение OpenAPI (также известный как Swagger), Java API, а также Javascript API для настройки ожиданий запросов и фиктивных ответов.

Это автономный процесс, который предоставляет интерфейс управления для настройки набора ожиданий, то есть сопоставления ожидаемых запросов и фиктивных ответов. Вы можете либо вызвать его REST API управления, либо использовать MockServerClient (версия Java или JS) для создания ожиданий.

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

На диаграмме ниже показаны ожидания в отношении обслуживания клиентов. Чтобы удовлетворить различные сценарии тестирования, отображение фиктивных ответов можно настроить для обычных случаев с 200 состояниями и случаями ошибок, такими как ошибка 404 и ошибка 500.

С настроенным набором ожиданий MockServer ищет набор ожиданий для входящих запросов и возвращает соответствующий фиктивный ответ во время выполнения теста.

API ценовых предложений

Чтобы лучше проиллюстрировать концепции, я покажу вам реализацию простого API страхового предложения. Система формирует коммерческое предложение по запросу клиента. Для создания предложения бизнес-правила кодируются в сервисе предложений, который управляет и использует REST API внешних служб - Customer, Product и Quotation Engine.

На схеме ниже показана логика API котировок, она проверяет профиль клиента и спецификацию продукта, после чего запускается API механизма котировок.

Компонент Структура

Если ваша система не является сверхпростой, настоятельно рекомендуется определить клиент API для обработки HTTP-связи и преобразования данных для каждой внешней службы. Такой дизайн положительно способствует реализации со слабой связью, делая систему простой в обслуживании для устранения неполадок и возможных изменений в будущем.

Клиенты API

Клиенты API отвечают за интеграцию с внешними API REST, такими как запрос и ответ HTTP-протокола, преобразование кода состояния ошибки, а также преобразование данных. Вот пример API-клиента для службы поддержки клиентов.

Репозиторий Git

Обратитесь к этому репозиторию GitHub (https://github.com/gavinklfong/spring-mock-demo.git) для получения полного исходного кода API цитат с автоматической реализацией тестирования.

Запустите команду maven mvn clean install, она автоматически соберет пример приложения и запустит тесты с MockServer.

Запустите MockServer для модульного тестирования

MockServer поддерживает ряд параметров для запуска сервера, таких как Java API, расширение JUnit, контейнер Docker и т. Д. В этом примере мы запускаем MockServer, используя аннотацию Java @MockServerTest для модульных тестов.

Вам необходимо включить следующую настройку зависимостей в Maven pom.xml.

<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-spring-test-listener</artifactId>
<version>5.11.1</version>
</dependency>

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

Настройка фиктивного ожидания с использованием OpenAPI

Затем давайте продемонстрируем, как настроить ожидания с помощью определения OpenAPI (также известного как Swagger). Поддержка определения OpenAPI меняет правила игры, поскольку использование спецификации OpenAPI - обычная практика для разработки REST API. Большинство поставщиков услуг используют его в качестве спецификации интерфейса своих служб API. Использование спецификации OpenAPI в качестве настройки фиктивного ответа экономит много усилий при разработке тестового примера.

Мок-ответ может быть встроен как часть спецификации API, вы можете указать его в качестве данных примера. Вот образец спецификации OpenAPI для конечной точки GET /customers/{id} с примерами данных.

Этот пример кода импортирует спецификацию OpenAPI в MockServer и инструктирует MockServer настроить фиктивный ответ состояния 200 для конечной точки API с идентификатором операции «getCustomerById». Вы можете попросить MockServer настроить ожидания для более чем одной конечной точки API, указав больше идентификаторов операции в вызове метода.

Когда клиент API-интерфейс клиента вызывается для получения клиента по идентификатору, он отправляет запросы API на MockServer, который возвращает фиктивный ответ.

Настройка фиктивного ожидания с использованием кода Java

В качестве альтернативы вы можете разработать фиктивные ответы, используя вызовы методов MockServerClient. Код прост, а шаблон кода похож на насмешку над Mockito. В этом примере показано, как настроить фиктивный ответ для API для получения продукта по идентификатору - [GET / products / {id}]

Модульный тест на сервисе котировок

Хотя для модульных тестов сервиса Quotation MockServer не требуется, не забудьте разработать тесты для сервиса Quotation. Реализацию тестового примера можно выполнить просто путем внедрения фиктивных компонентов для всех клиентов API. Ценовой сервис взаимодействует с макетами для проверки системной логики.

А как насчет интеграционных тестов?

После того, как все модульные тесты пройдены, пора собрать все компоненты и проверить системную логику от начала до конца в интеграционном тесте. Граница системы - это API котировок, который охватывает сервис котировок и всех клиентов API, в то время как все внешние сервисы имитируются с помощью MockServer.

Выполнить интеграционный тест с использованием жизненного цикла Maven

Maven предоставляет удобный способ выполнения интеграционных тестов. Фаза Maven, называемая предварительным интеграционным тестом, предназначена для инициализации сервисов и приложений перед выполнением тестовых примеров на этапе интеграционного теста. В конце интеграционного теста maven запустит этап пост-интеграционного теста, чтобы закрыть как приложение Spring Boot, так и MockServer.

На этапе предварительного тестирования мы сначала используем плагин maven build-helper-maven-plugin, чтобы зарезервировать доступные сетевые порты для приложения Spring Boot и MockServer, а затем запускаем службы в отдельных процессах с использованием подключаемых модулей maven mockserver-maven-plugin и spring-boot-maven-plugin соответственно.

Такая конфигурация maven необходима для автоматизации тестирования и конвейера CI / CD.

Настройки плагина Maven для резервирования сетевого порта

Плагин maven ищет 2 доступных порта и устанавливает переменные с именами spring-boot.http.port и mock-server.http.port на этапе предварительного интеграционного тестирования

Настройки плагина Maven для запуска MockServer

Приведенная ниже конфигурация плагина maven запускает MockServer с зарезервированным номером порта. Для инициализации всех ожиданий в MockServer при запуске используется класс java, указанный в <initializationClass>, который состоит из списка сопоставлений запроса и фиктивного ответа.

Класс инициализации реализует интерфейс под названием PluginExpectationInitializer, а initializeExpectations() содержит все настройки фиктивного ответа.

Настройки плагина Maven для запуска Spring Boot

Чтобы указать номер порта и переопределить URL-адреса всех внешних служб в Spring Boot application.yml, плагин запускает Spring Boot со списком аргументов. Приложение Spring Boot будет подключаться к MockServer для интеграции с внешними сервисами - Customer, Product и Quotation Engine.

Тестовый пример интеграции

Когда приложение Spring Boot и MockServer запущены и запущены, тестовый пример просто запустит веб-клиент, чтобы инициировать HTTP-запрос в Quotation Service для генерации предложения и проверить результат.

Последние мысли

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

MockServer - лучший вариант, когда дело доходит до разработки Java Spring Boot API, это мощный инструмент, который предлагает множество вариантов для автоматической настройки тестовых примеров, таких как Java API, JUnit Extension, Spring Test Execution Listener, Docker и т. Д. Конфигурация фиктивных данных прост и понятен, вы можете делать это как имитацию в стиле Mockito или просто использовать спецификацию OpenAPI.

Он без проблем работает с Maven, что значительно упрощает создание автоматизированного конвейера для запуска модульных тестов и интеграционных тестов с MockServer.