Como fazer os testes de integração usando Chai HTTP

Mateus Fernandes
4 min readApr 8, 2018

--

Os testes de integração são muito importantes para testar automaticamente as respostas e previsibilidade de um sistema, principalmente quando suas partes/módulos começarem a interagir entre si, e também para as respostas de requisições e acesso do usuário no sistema.

A criação de testes em uma API é essencial para assegurar seu comportamento e manter um desenvolvimento padronizado e previsível de outras ferramentas e funcionalidades.

Chai HTTP

O Chai HTTP é um plugin para a framework Chai, que é utilizado para permitir a criação de testes de integração com as rotas em servidores Node.JS.

Para fazer o teste, você precisa de uma versão do servidor Express e de requisitar a rota desejada.

Exemplo:

const server = require('server')const chai = require('chai')
const chaiHttp = require('chai-http')
chai.use(chaiHttp)chai.request(server).get('/')
.end((err, res) => {
chai.expect(res).have.status(200)
})

Vamos para a prática

Para iniciar o projeto, você irá precisar do Node.JS instalado.

Crie uma nova pasta, no meu projeto chamei de “teste-integracao”.

Para instalar as dependências para o projeto, crie um arquivo package.json com as configurações:

A estrutura do projeto será com os seguintes arquivos e pastas:

  • teste-integracao
  • — package.json
  • — routes.js
  • — server.js
  • — test
  • — — index.js (dentro da pasta test criada acima)

O arquivo routes.js terá duas rotas:

  • Uma rota com o método GET que retorna um ok
  • E uma rota com o método POST que retorna o texto enviado

O arquivo server.js terá as configurações para iniciar o servidor. Nele será configurado os pacotes e iniciado as rotas:

No arquivo de testes (test/index.js) será adicionado os testes de integração para as duas rotas criadas:

Usando o Chai HTTP é possível testar as requisições.

Na requisição de GET /:

chai
.request(app)
// => com o chai, o teste inicia uma versão da aplicação
.get('/')
// fazendo a requisição GET /
.end((err, res) => {
// ao finalizar a requisição, o callback com a resposta é chamado
/*
Neste teste, verificamos o status da resposta da requisição, se retornou um objeto, se ele contem a variavel "ok", se ela é booleana e tem o valor true
*/
expect(res).to.have.status(200); // status 200
expect(res.body).to.be.a('object'); // corpo da resposta é um objeto
expect(res.body.ok).to.be.an('boolean'); // variavel ok é booleana
expect(res.body.ok).to.be.equal(true); // variavel ok é true
done(); // finaliza o teste e vai para o próximo
});

Na requisição POST /:

chai
.request(app)
// => com o chai, o teste inicia uma versão da aplicação
.post('/')
// fazendo a requisição POST /
.send({ text: "teste" })
// enviando no corpo do POST, a variavel "text" com o valor "teste"
.end((err, res) => {
// ao finalizar a requisição, o callback com a resposta é chamado
/*
Neste teste, verificamos o status da resposta da requisição, se retornou um objeto, se ele contem a variável "ok", se ela é uma string e contem o valor que foi enviado na requisição POST
*/
expect(res).to.have.status(200); // status 200
expect(res.body).to.be.a('object'); // corpo da resposta é objeto
expect(res.body.ok).to.be.an("string"); // variavel ok é uma string
expect(res.body.ok).to.be.equal("teste"); // variavel ok é igual a "teste"
done(); // finaliza o teste e encerra
});

Agora com os testes criados, para executar é só entrar com o comando:

npm test

no terminal. Executando o comando, a resposta esperada é:

Mostrando que os testes foram executados com sucesso e tiveram uma resposta coincidente com a esperada.

Este exemplo é bem enxuto, mas representa a maioria dos testes de integração que irá fazer em um sistema em requisições que não utilizam o banco de dados.

O próximo passo para aprofundar e melhorar seus testes automatizados é a criação de testes em rotas relacionadas a banco de dados, onde o nível de complexidade e operação aumentam (dependendo do sistema em questão).

Sobre o assunto de testes e desenvolvimento com NodeJS e Express, estou criando um curso sobre Desenvolvimento guiado a Testes com NodeJS.

Para saber mais, é só entrar em tddcomnode.com

Você já desenvolveu algum sistema com testes de integração? Você utilizou alguma outra forma de testes? Conhece uma dica importante? Deixa uma resposta aqui :D

--

--