Criação de um MockService REST assíncrono no SoapUI com inicialização no Portainer

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.








All Articles