Criando mocks dinâmicos com SoapUI
No meu último artigo eu havia prometido falar um pouco sobre mocks e se você não está acostumado com o termo e precisa de uma explicação rápida eu vou tentar simplificar trazendo para o mundo de desenvolvimento backend. Digamos que sua squad está construindo uma API que consumirá informações de outra API que está sendo construída ao mesmo tempo que a sua por uma squad diferente, como você testará se seu trabalho está funcionando como deveria se a outra equipe ainda não disponibilizou a API de onde você deve consumir os dados? Alguns podem pensar “Vamos aguardar todos terminarem e testamos isso na fase de testes integrados”, mas precisamos lembrar da regra de ouro do desenvolvimento de software “Quanto antes um problema é encontrado, menor o custo para solucioná-lo”. Abaixo um gráfico mostrando como funciona a curva de custo.
Para testar o mais cedo possível e minimizar custos criamos os mocks que são simuladores, com esses simuladores podemos simular a resposta da API que ainda não foi disponibilizada e assim, caso seu serviço não esteja se comportando como deveria podemos iniciar os reparos imediatamente, evitando os custos de frustração, investigação e reparo gerados por uma API promovida com erros.
Como começo?
O primeiro passo é ter uma versão open source do SoapUI, neste artigo irei utilizar a versão 5.4. Você pode efetuar o download aqui.
Como crio meu primeiro mock?
Após efetuar a instalação padrão e abrir o SoapUI você terá uma tela assim:
Você deve começar criando um projeto e para fazer isso você deve clicar com o botão direito e selecionar “Create Empty Project”.
Após criar o nosso projeto podemos renomeá-lo na propriedade “Name”, vamos chama-lo de “Mock”. Agora está na hora de criar o nosso mockservice, clique com o botão direito no projeto e selecione “New REST mock service” e vamos dar o nome de “CEP”.
Para continuar precisamos configurar o nosso mock para definir em qual endereço e porta ele irá responder. Clicamos na engrenagem e definimos o “Path”, “Port” e “Host”, neste caso iremos alterar apenas o Host para “localhost” e clicaremos em “Ok”.
Pronto, nosso serviço já está configurado, agora precisamos criar uma ação para o nosso serviço.
Clique com o botão direito no serviço e selecione “Add new mock action”, aparecerá uma janela perguntando qual o tipo do serviço e o caminho em que ele responderá. Em nosso caso iremos criar o serviço do tipo “GET” e informaremos o “Resource path” “/correios/{CEP}”.
Neste caso a informação “{CEP}” deve constar apenas no nome do nosso mock para representar que nosso serviço recebe o parâmetro cep, mas deve ser apagado do nosso path.
Pronto, temos um serviço e agora vamos configurar as respostas que ele deve simular. Clique com o botão direito no serviço correios e selecione “New mock response” vamos dar o nome de “01138000”.
Vamos configurar qual o status que queremos de resposta, neste caso “200-OK”, o content “application/json” e o conteúdo que o serviço mockado deveria retornar.
Não há necessidade de salvar, basta clicar no botão de fechar. Agora é clicar com o botão direito no nosso serviço de CEP, clicar em “Restart” e pronto nosso serviço estará rodando.
Hora de testar, estou utilizando o Insomnia mas pode utilizar qualquer client como Postman e etc… Informamos o endereço que configuramos e fazemos a chamada “http://localhost:8080/correios”.
Voilà, temos um serviço mockado simulando a API que iremos consumir. Agora vamos simular uma resposta diferente para testar se nossa API está lidando corretamente com uma resposta de erro.
Criamos um novo mock response com o nome “erro”.
Testamos novamente nosso serviço e ele deve alternar entre as nossas duas respostas.
Como controlo as respostas dinâmicas?
Ok, nosso serviço fica respondendo alternadamente mas eu gostaria de poder escolher qual resposta o serviço deve apresentar, tem como fazermos isso de forma dinâmica? Tem sim, mas precisaremos usar um pouco de lógica de programação.
Em nosso mock vamos alterar o Dispatch para “Script”.
O próprio SoapUI oferece alguns exemplos de scripts comentado em verde. Iremos utilizar o exemplo “Match based on path”.
Este script pega as informações enviadas através do requestPath e coloca em na variável “requestPath” nos possibilitando checar se a variável contem determinados valores e devolvendo uma resposta diferente a cada valor checado.
Neste script eu fiz a validação que se o requestPath receber o cep 01138000 ele deverá responder nossa resposta pré-montada chamada “01138000” caso contrário ele deve responder nossa mensagem de erro.
Então vamos testar, primeiro a chamada com sucesso:
Agora uma chamada com falha:
Pronto, agora você já está pronto para começar a criar e automatizar seus mocks.
No próximo artigo ensinarei como criar os outros tipos de response e ensinarei também como otimizar o script utilizando o groovy.