Русский
Русский
English
Статистика
Реклама

Создание в SoapUI асинхронного REST MockService с запуском в Portainer

Задача

Разработать мок для проверки асинхронного обмена сообщениями с внешней системой.

Как пример, рассмотрим некий кейс проверки валидности промокода внешней системой. По шагам:

1) Отправляем запрос в сервис внешней системы;

Запрос PUT содержит поля (например, в headers):

  • promotionalCode=correctPromotionalCode

  • correlationId=рандомная строка, которую нужно будет вернуть вcallback

  • replyTo= адрес сервиса принимающего callback

2) Внешняя система отвечает синхронно - 204 No content;

3) Через 5 секунд внешняя система отправляет асинхронный callback (по адресу replyTo из запроса):

ЗапросPOST с телом сообщения:

  • status = "success", еслиpromotionalCode запроса равен "correctPromotionalCode", в остальных случаях - "validationError"

  • correlationId = correlationId из запроса

Решение

Для решения данной задачи используем SoapUI. Данный инструмент достаточно гибок в плане создания "умных" моксервисов, тк позволяет написать скрипты, как на этапах запуска/остановки моксервиса (Start Script/ Stop Script), так и перед/после получения запроса (OnRequest Script/AfterRequest Script).

Начнем:
1) В SoapUI создать новый проект, например, "test-soapui-project" (либо выбрать существующий) и создать для него два REST MockService.

Первый назовем Validation REST MockService - имитирует сервис внешней системы:

  • в Path произвольный путь к моксервису, например, "/SP/ValidationSystem",

  • в Port значение порта на котором будет запущен мок,

  • в Host значение "localhost".

Второй назовем Validation Receiving CALLBACK REST MockService - имитирует сервис принимающий callback (данный мок нужен для локальной проверки "Validation REST MockService" перед тем как мы его запустим на общем сервере):

Аналогичнов Path произвольный путь к моксервису, например, "/SP/SpHost"


2) В мокValidation REST MockService добавить:

  • запрос PUT

Указываем:

  • в ResourcePath произвольный путь к методу внутри моксервиса, например, "/validation"

  • в Method указываем метод Rest запроса, в нашем случае PUT (шаг 1 в задаче)

  • для запроса PUT добавить ответ204 No content

Указываем:

  • в Http Status Code код ответа на запрос,в нашем случае "204 - No Content",

  • в Content | Media type тип ответа на запроса, в нашем случае "application/json".

  • переменные в Properties:

это переменные в которые будут сохранены поля promotionalCode, replyTo,correlationId изпоступившего запроса PUT.

  • OnRequest Script - данный скрипт будет выполняться перед отправкой синхронного ответа 204 No content (шаг 2 задачи). Получаем из запроса необходимые значения и записываем в Properties:

*log.infoможно не использовать, носит информативный характер для проверки хода выполнения операций на вкладке script log.

  • AfterRequest Script - данный скрипт выполнится после отправки синхронного ответа. Тут наша задача сформировать callback на основании полученных данных, имитировать небольшую задержку (в нашем случае 5 секунд), отправить callback по адресу replyTo (шаг 3 задачи):

Сам скрипт:

log.info" Afterequest Script Синхрона - начало"import java.lang.Exception//Создаем переменные для формирования callback'а , используя значения из Propertiesdef replyTo = context.mockService.getPropertyValue('replyTo')def correlationId = context.mockService.getPropertyValue('correlationId')def promotionalCode = context.mockService.getPropertyValue('promotionalCode')def status = "testStatus"if ( promotionalCode.contains("correctPromotionalCode")){status="success"}else{status="validationError"}//Произвольное ожиданиеThread.sleep(5000)log.info"до Отправки callback"// формируем callback - Запрос POSTdef conn = new URL(replyTo).openConnection();def message = """\{"status":"${status}","correlationId":"${correlationId}"}"""conn.setRequestMethod("POST")conn.setDoOutput(true)conn.setRequestProperty("Content-Type", "application/json")conn.getOutputStream().write(message.getBytes("UTF-8"));def postRC = conn.getResponseCode();println(postRC);if(postRC.equals(200)) {println(conn.getInputStream().getText());}log.info"после Отправки callback"log.info" Afterequest Script Синхрона - конец"

3) В мокValidation Receiving CALLBACK REST MockService добавить:

  • запрос POST

Указываем:

  • в ResourcePath произвольный путь к методу внутри моксервиса, например, "/callback"

  • в Method указываем метод Rest запроса, в нашем случае POST.

  • для запроса POST добавить ответ200 OK

Указываем:

  • в Http Status Code код ответа на запрос,в нашем случае "200 - OK",

  • в Content | Media type тип ответа на запроса, в нашем случае "application/json".

  • OnRequestScript - в скрипте мы выводим сообщение, что callback успешно получен и смотрим, что в нем пришло:

4) Запустить оба моксервиса

5) Проверяем работу моксервисов

Отправляем запрос проверки валидации, например, через Postman:

  • Выполняем PUT вызов метода validation на Мок 1 (Validation REST MockService), указывая в Headers 3 параметра, как описано в Задаче

  • В replyTo указываем адрес сервиса принимающего callback - Мок 2 (Validation Receiving CALLBACK REST MockService)

При выполнении запроса видим в ответе - 204 No Content.

Проверяем в script log SoapUI , что callback пришел на Мок 2:

Запуск моксервиса в Portainer:

1) В images добавляем образ для работы с моксервисами SoapUI:

  • находим на docker hub необходимый образ. в нашем случаеfbascheper/soapui-mockservice-runner (https://hub.docker.com/r/fbascheper/soapui-mockservice-runner/)<o:p>

  • переходим в Portainer в раздел images

  • по названию загружаем необходимый образ

2) Разворачиваем стек для работы смоксервисами :

  • СоставитьCompose file:

version: "3.7"services: soapui-validation:    image: fbascheper/soapui-mockservice-runner:latest    volumes:      - /soapui/soapui-prj:/home/soapui/soapui-prj    environment:      - MOCK_SERVICE_NAME=Validation REST MockService      - PROJECT=/home/soapui/soapui-prj/test-soapui-project.xml    ports:      - 7703:8080

где:

image - образ загруженный с docker hub (https://hub.docker.com/r/fbascheper/soapui-mockservice-runner/)

volumes - указать где на сервере расположен проект soapUI и куда его необходимо расположить в контейнере, формат: "директория на сервере": "директория в контейнере"

MOCK_SERVICE_NAME - название моксервиса внутри проекта soapUI

PROJECT - путь к проекту soapUI в контейнере, формат: значение "директория в контейнере" из volumes + само название проекта(в нашем случае test-soapui-project)

ports -указать внешний порт по которому моксервис будет доступен извне и на каком порте запущен в контейнере (значение port из soapUI), формат "внешний порт": "порт в контейнере"

*в нашем примере проект soapUI разместили на сервере в/soapui/soapui-prj/

  • перейти в Portainer в раздел Stacks,

  • добавить новый стек:

    - указать в поле Name, как будет назван наш стек, например, sp-soapui-mocks,

    - в Web editor копируем текст Compose file,

  • Deploy the stack.

В результате будет сформирован стек sp-soapui-mocks, в котором запущен сервис , указанный в compose file:

Итого

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

Источник: habr.com
К списку статей
Опубликовано: 26.03.2021 02:13:21
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Тестирование it-систем

Api

Soapui

Mock

Portainer

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru