Testes de integração para aplicações Node.js com Mocha e Chai
No ciclo de vida de uma aplicação existem diversas tarefas. Uma das mais importantes é o teste. Afinal, de que adianta programar um sistema se não é possível atestar o seu funcionamento? A melhor forma de checar se um sistema funciona é testando-o, preferencialmente de forma automatizada. Essa automação é possível através da implementação de Testes de Unidade. O problema é que esse tipo de teste nem sempre é eficaz, muitas vezes os erros ocorrem durante a integração do sistema com componentes externos. É aí que entram os Testes de Integração. Então, como podemos criar esses testes para aplicações Node.js? Para isso vamos utilizar dois módulos: Mocha e Chai.
💡 Se você ainda acha que testes não são importantes, recomendo a leitura desse artigo.
Pré requisitos
O leitor precisa estar familiarizado com a linguagem Javascript e o Node.js. Para seguir o tutorial será necessário baixar esse projeto e iniciá-lo com o comando npm start.
Estrutura do Projeto
Vamos começar abrindo o nosso projeto no Visual Studio Code:
Iremos criar o diretório test/integration para adicionar os testes de integração:
Essa é a estrutura necessária para começarmos a implementar os testes de integração no nosso projeto Node.js. Simples, não é mesmo?
Mocha como framework de testes
O Mocha é um framework de testes que fornece a estrutura necessária para rodar um teste automatizado. Então, como podemos utilizá-lo? Primeiro, precisamos adicioná-lo como dependência do projeto:
$ npm install mocha@6.1.4 --save-dev --save-exact
💡 O mocha é um módulo para testes utilizado apenas durante o desenvolvimento. Por isso, foi utilizada a opção save-dev. A opção save-exact é para garantir que a versão descrita nesse tutorial será a instalada na sua máquina.
Feito isso, precisamos implementar o teste de fato. Iremos assumir aqui que o escopo dos testes será o serviço de criação de usuário. Então, vamos criar um arquivo chamado usuario.js dentro do diretório test/integration:
Precisamos descrever quem será testado, e cada cenário de teste. Para isso, podemos utilizar o código abaixo como template:
O describe descreve a API testada e cada um dos serviços. Já o it vai descrever cada cenário de teste do serviço descrito. Por exemplo, na nossa API nós definimos que existem os seguintes cenários de execução do serviço de criação de usuário:
- O usuário é cadastrado com sucesso
- O usuário já existe e por isso o sistema irá obtê-lo a partir da sua localização existente
- Os dados de criação do usuário não foram passados corretamente ou são inválidos
O it recebe como argumento uma função com o parâmetro done. Esse objeto é uma função utilizada para informar ao Mocha quando o teste será concluído. Por isso, foi necessário chamar o done() dentro de cada cenário de teste.
Para finalizar a configuração do Mocha, vamos criar um arquivo mocha.opts dentro do diretório test para informar que existem arquivos de teste dentro de subdiretórios do test:
Será possível executar o teste criado com o comando abaixo (lembre de iniciar o projeto com o npm start antes de rodar os testes!):
Podemos adicionar esse comando no package.json e executar os testes apenas com o comando npm test:
Os testes passaram pois nenhuma lógica está sendo avaliada. Precisaremos fazer requisições à API e validar as respostas obtidas. Para isso, vamos utilizar o Chai.
Chai como biblioteca de asserção
O Chai é um módulo que possui diversas funções de asserção que permitem validar se os retornos do teste estão de acordo com o esperado. Para utilizá-lo no nosso projeto, vamos primeiro instalá-lo:
$ npm install chai@4.2.0 --save-dev --save-exact
Agora, vamos começar a implementar os cenários de teste utilizando o Chai. O primeiro cenário descreve uma situação em que o usuário é criado com sucesso. Isso significa que o serviço é chamado com todos os dados necessários para criar um usuário válido. Vamos então descrever esses dados válidos num arquivo JSON chamado data.json, criado no diretório test/integration:
Vamos importar esse arquivo no teste para que seja possível utilizar esse dado:
Para fazer uma chamada POST à API, vamos precisar de um cliente HTTP. O Chai também provê um cliente através do módulo chai-http:
$ npm install chai-http@4.3.0 --save-dev --save-exact
Agora vamos fazer a chamada à API utilizando esse módulo:
A primeira coisa que fizemos foi importar os módulos chai e chai-http. Para utilizar o chai-http, é necessário utilizar a função use do objeto chai. Também utilizamos a função should para ter acesso as operações desse estilo de assertiva. Feitas as importações, a chamada à API é bastante simples. A partir do objeto chai é feita uma request com o método post enviando como corpo da requisição um USUARIO_VALIDO. A resposta é tratada pela função end, que recebe como argumento um objeto de erro e a resposta. O que declaramos dentro dessa função são as assertivas de como esperamos que a nossa API funcione. O que dissemos no teste desse cenário foi:
- Não deve haver erros
- A resposta deve ter um corpo
- O código retornado deve ser 201
- O corpo deve ter uma propriedade error igual a 0
- O corpo da resposta deve estar no seguinte formato:
{"error":0,"payload":{"comments":{"nome":"Rachel Green","_id":"<Alguma coisa>"}}}
A implementação desse cenário foi concluída. Vamos executar os testes e verificar se estão passando:
Para visualizar o cenário em que o teste não passa, vamos modificar o serviço de criação do usuário (localizado em controllers/usuario/create.js) para retornar o comments vazio:
Salve o arquivo e execute os testes novamente:
O log informa claramente que o teste 1 falhou pois era esperado que um objeto vazio tivesse a propriedade _id.
Conclusão
Nesse post vimos como elaborar testes de integração para projetos Node.js utilizando os módulos Mocha e Chai. A documentação de ambos é excelente e pode servir de guia durante a implementação dos testes. Como exercício, eu deixo a implementação dos outros dois cenários de teste que não foram cobertos. Afinal, a prática leva a perfeição!
Se você gosta do meu conteúdo, não deixe de conferir o meu canal do Youtube, onde falo sobre desenvolvimento de software. Espero te ver por lá! 😉