Framework para testes de API com Java e Spring Boot Test — Parte 1
Na Mercedes-benz.io (MB.io), colaboramos em times multidisciplinares (nada de novo para uma organização baseada no framework Scrum).
Faço parte de um destes times, que é responsável por um microserviço escrito em Java. Sendo que este microserviço faz o envio de dados uma aplicação back-office (SAP), nós precisamos fazer os testes das APIs que pertencem ao mesmo.
Com isto em mente, tínhamos o desafio de re-construir o framework para realizar a automação dos testes de API, pois o antigo framework estava apresentando alguns problemas e precisava de um revamp.
Nesta série de artigos, vamos abordar os seguintes tópicos:
- Como escolhemos as ferramentas
- O processo de criação e melhoria do framework
- Configuração da pipeline para execução dos testes
- Relatório dos testes
Escolhendo a linguagem e ferramentas
O principal motivo pelo qual escolhemos um framework baseado em Java, como você já deve imaginar, foi porque o nosso time é composto principalmente por desenvolvedores Java e o microserviço em si também é escrito nesta linguagem. Com isso, os próprios desenvolvedores também nos ajudam a criar a solução certa e a manter o projeto.
O framework de testes que nós escolhemos para ser a base da nossa solução foi o Rest Assured.io. A razão por trás disto é que o framework em si é usado em vários outros projetos dentro de nossa tribo aqui na MB.io e amplamente usado e mantido pela comunidade.
Escolhemos também o Spring Boot para organizar, estruturar e ser a base do projeto.
Configurando o projeto
Passo 1: Criar o projeto
Escolhemos o Maven como nosso gerenciador de dependências. A primeira coisa a se fazer será adicionar as dependências que precisamos no nosso projeto.
Dica: Você pode usar o inicializador de projetos do spring boot para obter o arquivo pom.xml com o setup inicial que precisamos.
Depois disto, precisamos adicionar as dependências do rest-assured e outras coisas que iremos usar para tornar nossas vidas mais fáceis.
O arquivo pom.xml vai ficar mais ou menos assim:
Com isto iremos começar a organizar nosso projeto.
Passo 2: Alteração na classe Main
A classe Main precisa ser alterada para que seja uma SpringBootApplication. E o método main() precisamos alterar para correr como uma SpringApplication.
Passo 3: Criar um Service para gerenciar sua API
Para abstrair o acesso e configurar as requisições em um só lugar, podemos usar a parte de Serviços do Spring Boot e tirar alguma vantagem disto.
Este é o lugar para configurar as requests de sua API.
Vamos criar um novo método aqui para abstrair o uso de uma requisição do tipo POST. Nesta requisição vamos prover uma URL e o JSON que enviaremos no body.
Nota: Vamos retornar o response por completo. Desta forma dentro do caso de teste podemos validar o que é necessário para satisfazer as condições do teste.
No arquivo acima, nós também tiramos vantagem do uso de uma função built-in chamada RequestSpecification que o rest-assured tem para configurar a baseURI e o basePath para este serviço. Esta é uma forma inteligente de configurar o acesso às suas APIs, pois caso você tenha que configurar mais de uma API para obter/postar dados, cada um pode ter seu próprio setup.
Passo 4: Adicionar um teste
Antes de mais nada, vamos adicionar as anotações do JUnit5 e Spring boot para ser uma classe de teste.
Após isto, vamos adicionar o método contrutor da classe e vincular o serviço a uma variável de classe.
Agora estamos bem para iniciar a adição de novos testes. Vamos fazer isto.
O método postRequest espera dois parâmetros:
- o endpoint que nós queremos enviar dados como String;
- o corpo da requisição como JsonNode.
A primeira coisa que devemos fazer é criar um objeto para ser enviado no corpo da requisição. Vamos usar a biblioteca jackson-databind para nos ajudar a mapear o objeto JSON.
Agora, vamos fazer a requisição para a API e validar a sua resposta. O resultado disto será algo assim:
Nota: Tenha em mente que esta é a primeira iteração que temos neste projeto. Podemos (e vamos!) melhorar o código para separar algumas responsabilidades e limpar um pouco o código.
O que vimos até agora:
- Setup básico do projeto
- Como estruturar o projeto
- Como abstrair as requisições na camada de serviços
- O primeiro teste
Este é o fim da parte 1 desta série de posts. A próxima parte irá cobrir:
- Refatoração no object mapping
- Melhorar a validação das respostas
- Arquivos de propriedades
See you soon!