Framework para testes de API com Java e Spring Boot Test — Parte 1

Luiz Eduardo Martins
3 min readNov 30, 2022

--

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!

--

--