Testes Automatizados de APIs com JEST & SUPERTEST

Sofia Trindade
Bee Lab Academy
Published in
6 min readMar 29, 2020

Como estamos numa constante evolução tecnológica já existem diversas ferramentas/frameworks open source que ajudam na escrita automatizada de testes. E, já começa a ser difícil saber qual a que melhor se adequa à nossa situação.

Os testes automatizados a APIs, como todos já devem saber, enquadram-se na camada intermédia da piramide de testes, que é onde se fazem os testes de integração.

Pirâmide ideal de testes segundo Martin Fowler

Da pirâmide retira-se, que é muito mais rápido e barato fazer testes de baixo nível do que testes de alto nível. Logo, se queremos poupar tempo e dinheiro devemos investir mais nos testes de baixo nível. A quantidade de testes deve diminuir á medida que subimos para os níveis superiores.

Testes unitários vs testes de integração.

Os Testes de Integração visam (como o próprio nome diz) a integração das partes isoladas do sistema, um exemplo prático deste tipo de testes é o da “porta e da fechadura” em que o requisito é a fechadura trancar a porta. Como apenas foram feitos testes unitários aos componentes isoladamente, quando houve a integração dos mesmos não cumpriam o requisito, porque aquele tipo de fechaduras não trancam portas de deslizar. Assim, através dos testes de integração conseguimos perceber se os componentes que foram desenvolvidos isoladamente quando interligados cumprem ou não com os requisitos do negócio.

Após a análise do que já existia no mercado foram escolhidas as seguintes ferramentas/frameworks open source para proceder à automatização de testes de APIs.

Para se proceder á instalação, primeiramente tem que se instalar o node.js na máquina pretendida, para isso basta fazer o download do executável.

De seguida, através da linha de comandos aceder a uma pasta onde se queira guardar os testes e executar os seguintes comandos:
npm init — para inicializarmos a utilização do npm e definirmos algumas informações sobre os testes/projeto, nomeadamente a parte em que definimos qual o comando que vai fazer com que corram os testes, neste caso colocou-se “test”. Após a execução deste comando vamos ter na pasta selecionada um ficheiro cujo nome é “package.json” que serve para guardar algumas definições, como scritps de execução de comandos, caminhos de diretorias onde são guardados outputs dos resultados dos testes, dependências, etc;
npm install jest supertest — para instalarmos os packages do jest e supertest. Após a execução deste comando vamos ter uma pasta chamada “node_modules” que é onde estão guardados os packages instalados. Também os ficheiros “package.json” e “package-lock.json” são alterados para incluírem as informações dos novos packages instalados.

Após executarmos os dois comandos anteriores, e caso necessitemos de colocar o repositório dos testes noutra máquina apenas temos de fazer:
npm install ou npm i– para instalar o npm, os packages das dependências e as definições contidas no ficheiro “package.json”.
O ficheiro “package.json” deve ficar com as mesmas configurações ilustradas de seguida:

Após o término da instalação estamos prontos para iniciar a escrita dos testes. Para isso, apenas precisamos de um editor de texto (até o bloco de notas que vem com o windows serve, mas existem outros mais adaptados para a programação, por isso eu gosto mais de usar o Visual Studio Code).

Dentro do editor vamos começar a escrever num ficheiro. Primeiramente teremos que importar o package que instalamos do supertest para uma constante (porque vai ser reutilizada ao longo do teste para se acessar aos seus métodos).
Depois vamos passar-lhe o URL da API (por exemplo “http://localhost:8080”) e definir o request:
• se é um .GET/.POST/.PUT/.DELETE
• se precisamos de atribuir headers através do “.set
• se precisamos de passar alguma query através do método “.query”;
• e definir o status code esperado através do método “.expect”.
Existem mais métodos que podemos usar, para isso deveremos consultar a documentação do supertest.
Como, por vezes, precisamos também de validar o body das respostas podemos usar o “.then” para analisar o que retorna a resposta e fazer “expect” (mas este expect é diferente do que usamos para o status code do supertest, porque este é do JEST) podendo, com este utilizar outros métodos que nos ajudam a fazer melhores validações, para saber quais outros métodos usar devemos consultar a documentação do JEST.

Para além deste expect o JEST tem mais alguns métodos que nos vão ser úteis na escrita dos testes, tais como:
describe: é como se fosse uma suite de testes, ou seja um describe pode ter um conjunto de testes. Dentro dos describes podemos ainda colocar outros describes com outros conjuntos de testes como se pode visualizar no “Summary” da figura abaixo;
it ou test: são os nossos testes, cada it é um teste, logo os describes aglomeram um conjunto de its;
beforeAll/beforeEach: estes dois métodos conseguem executar coisas antes de todos os testes (beforeAll) ou antes de cada teste (beforeEach). Exemplos práticos dos dois casos podem ser:
> No beforeAll iniciar a conexão a uma base de dados;
> E no beforeEach a execução de um script de inserção de algum dado que iremos precisar nos testes;
afterAll/afterEach: estes dois métodos (que são o contrário dos de cima) conseguem executar coisas depois de todos os testes (afterAll) ou antes de cada teste (afterEach). Exemplos práticos dos dois casos podem ser:
> No afterAll fechar a conexão a uma base de dados;
> E no afterEach a execução de um script de remoção de algum dado que apenas foi utilizado nos testes.

Depois de termos os testes todos automatizados precisamos de saber se estão a funcionar, para isso precisamos de os executar.

Para executar estes testes apenas basta correr um comando no terminal que é “npm test”. Porquê este comando? Porque foi o que nós definimos no passo da instalação quando fizemos “npm init”. Mas, para confirmar podemos aceder ao ficheiro “package.json” que tem na secção dos scritps o comando de “test” definido. Este comando vai chamar o nosso test runner , o JEST, que compreende todos os ficheiros com a seguinte nomenclatura <nome>.test.js” e vai executar todos os testes que estiverem dentro deles. Como se observa na próxima imagem.

Por fim, para qualquer sistema de deploy apenas é necessário executar os seguintes comandos dentro da pasta onde estiver o ficheiro do package.json.

  • npm i
  • npm test

Podem ver o meu repositório no git hub que contém alguns exemplos destes testes.

📌 https://github.com/sofiatrindade/APITesting_JEST_SUPERTEST 📌

--

--