Testes de schema de API com Joi
Quem nunca se deparou com alguns problemas utilizando schemas em API? Seja você desenvolvedor, testador ou analista. Em algum determinado tempo, alguma aplicação em que você trabalha já quebrou, por não receber o que era esperado. Com isso surgiram os testes de contratos de API. Hoje, os testes de contratos de API são muito utilizados quando consumimos APIs de terceiros ou até de times distantes, para ter essa garantia contínua do contrato.
O que são schemas de API?
Na fase inicial da concepção de um endpoint ou de um micro serviço, ocorre a modelagem e a documentação da API, lá está definido quais serão os tipos de respostas, como deverá ser o seu retorno e qual a tipagem dos campos de um contrato.
Exemplo de um schema:
E o que são os Testes de schema de API?
Com o entendimento do que são schemas de API, podemos dizer que a função das validações de schemas de API é garantir que tudo que foi definido em um contrato acordado, não tenha sido modificado ao ser implementado. Para garantir, podemos validar o schema que é retornado, a tipagem do campo retornada, valores limites, campos opcionais e obrigatórios, valores pré-definidos, entre outros tipos de validações.
Como podemos fazer isso?
Para fazer essas validações rápidas e assertivas, podemos utilizar o Joi em javascript. Essa ferramenta é um Object schema validation, será o nosso responsável por fazer as validações nos objetos retornados da API.
LET’S CODE!!!!
Configurações e instalações iniciais:
- Node e NPM instalados
- Acessar a pasta do seu projeto e executar
npm init
(Configurações default) - Configurar o babel
npm install --save babel-core babel-preset-env
- Criar um arquivo com nome
.babelrc
e adicionar{"presets": ["env"]}
- Executar o seguinte comando para adicionar as dependências de desenvolvimento
npm install --save-dev joi joi-assert mocha supertest
- Instalar o reporter mochawesome
npm install --save-dev mochawesome
Configuração do helper para uso de variáveis globais:
Criar uma pasta chamada test
na raiz do projeto e dentro dela adicionar um arquivo chamado helpers.js
. Esse arquivo serve para armazenar variáveis ou métodos globais para sua suíte. Adicionar as seguintes linhas ao arquivo:
Obs.: Na variável definida como global.request
chamamos o método supertest
passando a url do serviço utilizado para os testes.
Configuração do arquivo mocha.opts
O arquivo mocha.opts
é um arquivo de configurações do mocha, que serve para passar alguns parâmetros, tais como: timeout de request, compiler e o nosso helper. Para configurar, basta criar um arquivo chamado mocha.opts
dentro da nossa pasta test
com as seguintes linhas:
Criando um teste de schema de API
Agora, vamos à criação do teste em específico. Vamos começar testando o seguinte endpoint https://jsonplaceholder.typicode.com/posts.
Este endpoint retorna uma lista com objetos que representam uma publicação. Observando a API, podemos validar que todos os campos são obrigatórios, os dois primeiros são do tipo number e os dois últimos são string. Com essa definição podemos iniciar os testes criando uma pasta dentro da pasta test
chamada schemas
e dentro da pasta criamos um arquivo chamado posts.js
.
Para escrever a suíte os casos de testes vamos utilizar o describe
e o it
do mocha. Segue abaixo a suíte e o teste, sem nenhuma implementação.
Como o retorno da nossa API é um array em que os itens são objetos, vamos iniciar criando uma variável e utilizando a função array do Joi e, a seguir, passar o objeto e seus itens. Segue abaixo:
Após este passo, basta criar o request passando o endpoint e fazendo o assert com o joiAssert
, passando o response e o esperado (joiAssert(res.body, postsList)
).
Para algumas garantias a mais no response eu adiciono duas linhas abaixo do .get
para validar o Content-Type
e o Status Code
Para finalizar, seu teste vai ficar assim:
E, para rodar o seu teste, basta executar o seguinte comando mocha --opts test/mocha.opts test/schemas/**/*.js
ou adicionar um script ao seu package.json
:
Para finalizar
Dentro da pasta mochawesome-report
será gerado um HTML com um relatório de seus testes.
Então, de um jeito fácil e rápido você poderá implementar testes de schemas de API para rodar junto de seus testes unitários, assim garantindo maior qualidade as suas entregas.
Para conferir a solução aplicada nesta publicação, com mais alguns testes, é só acessar meu Github: https://github.com/maximilianoalves/joi-schema-test