Tarefa
Desenvolva uma simulação para testar mensagens assíncronas com um sistema externo.
Como exemplo, considere um caso de verificação da validade de um código promocional por um sistema externo. Passo a passo:
1) Enviamos um pedido para o serviço de um sistema externo;
A solicitação PUT contém campos (por exemplo, em cabeçalhos):
promocionalCode = correctPromotionalCode
correlaçãoId = uma string aleatória a ser retornada para o retorno de chamada
replyTo = endereço do serviço que recebe o retorno de chamada
2) O sistema externo responde de forma síncrona - 204 Nenhum conteúdo;
3) Após 5 segundos, o sistema externo envia um retorno de chamada assíncrono (para o endereço replyTo da solicitação):
Solicitação POST com corpo da mensagem:
status = "sucesso" se o pedido promotionCode for "correctPromotionalCode", caso contrário, "validError"
CorrelaçãoId = CorrelaçãoId da consulta
Decisão
Para resolver esse problema, usamos SoapUI. Esta ferramenta é bastante flexível em termos de criação de moxervices "inteligentes", uma vez que permite escrever scripts tanto nas fases de iniciar / parar moxervice (Start Script / Stop Script) e antes / depois de receber um pedido (OnRequest Script / AfterRequest Script )
Vamos começar:
1) Crie um novo projeto no SoapUI, por exemplo, "test-soapui-project" (ou selecione um existente) e crie dois REST MockService para ele.
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
:
Resource Path , , "/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' , Properties
def 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 - POST
def 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
:
Resource Path , , "/callback"
Method Rest , POST.
POST 200 OK
:
Http Status Code , "200 - OK",
Content | Media type , "application/json".
OnRequest Script - , 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), " ": " "
* em nosso exemplo, o projeto soapUI foi colocado no servidor em / soapui / soapui-prj /
vá para o Portainer na seção Pilhas,
adicione uma nova pilha:
- especifique no campo Nome como nossa pilha será nomeada, por exemplo, sp-soapui-mocks,
- copie o texto do arquivo Compose no editor da Web,
Implante a pilha.
Como resultado, a pilha sp-soapui-mocks será formada, na qual o serviço especificado no arquivo de composição é iniciado:
Total
Temos um moxervice assíncrono que satisfaz a tarefa em questão. O serviço é lançado em um servidor comum e está disponível para todos os participantes do projeto. No momento, ele nos ajuda a desenvolver e testar o aplicativo na ausência de uma API de sistema de terceiros.