Testes de Integração
Tags: testing, javascript, jest, tdd
Published: 2024-05-13 02:42:05

Os testes podem parecer triviais, mas são essenciais para garantir a qualidade e confiabilidade de uma API. Atualmente, o Jest é uma das ferramentas mais utilizadas para testes e desempenha um papel crucial, especialmente quando combinado com outras ferramentas, como o Supertest, que torna o processo de testes mais prático.

Vamos supor que exista uma API de produtos que recebe nome e preço, utilizando a rota POST. Esta rota retorna o status 201 se o objeto for criado com sucesso e o status 422 se houver algum erro no envio dos dados, como a ausência do corpo da requisição.

Primeiramente, é necessário instalar o Express, um framework amplamente conhecido para a criação de APIs no Back-End.

	 `npm install express`

_Lembre-se de que é necessário instalar o Node juntamente com o gerenciador de pacotes npm._

Agora, será criado um arquivo index.js, onde será feita a importação do Express:

	`const express = require("express");`

Após a importação, será criada uma instância do módulo Express:

	`const app = express();`

Em seguida, será criado o servidor Express utilizando o método .listen(), que receberá a porta para funcionamento local. Também será passada uma função responsável por imprimir no terminal uma mensagem para ajudar a identificar se o servidor está funcionando:

	`app.listen(3333, function(){
		console.log("Servido funcionand!")
	})`

Agora, o arquivo index.js será exportado:

	`module.exports = app;`

Em seguida, será criado um arquivo de rotas chamado rotas.js, onde será feita a implementação. O Express será importado e será criada uma constante com um array vazio que receberá os produtos:

	`const express = require("express");
	const produtos = [];`

Então, será implementada a rota POST:

	`const router = express.Router()`

Então iremos fazer a implementação da nossa rota POST:

	`router.post("/produtos" function(req, res){
		if (req.body && req.body.preco){
			const novo = {id: produtos.length + 1, nome: req.body. preco}
			produtos.push(novo)
			return res.status(201).json(novo);
		}
	res.status(422).send({});
	})`

_Nesta aula, não será feita a separação entre rotas e middlewares, mas em breve, um artigo explicando melhor sobre middlewares e aplicando o padrão MVC na prática será disponibilizado._

Na implementação, foi criada uma rota definida como "/produtos". Dentro dela, é feita uma verificação: se o usuário fornecer as informações necessárias do produto, um novo produto é criado e armazenado na constante "novo". Na expressão "(req.body && req.body.preco)", é verificado se o corpo da requisição existe e se possui os atributos nome e preço. Em seguida, o novo produto é adicionado ao array utilizando o método push, "produtos.push(novo)". No final, a resposta é retornada ao usuário com o código 201

Caso a verificação falhe, ou seja, se o usuário não fornecer as informações necessárias, uma resposta com status de erro 422 e uma mensagem qualquer (neste caso, em branco) é retornada, em ".send({});".

Por fim, o módulo de rotas será exportado:

	`module.exports = router;`

Voltando ao arquivo index.js, será feita a importação do arquivo de rotas e será informado ao Express para utilizá-lo:

	`cont routerProdutos = require("./router");
	app.use(routerProdutos)`

Pronto! O servidor foi criado no index.js e a rota, juntamente com a implementação, foi feita. Agora, será realizada a parte principal: os testes.

Será criado um arquivo chamado produtos.test.js. É importante notar que o ".test" no meio do nome do arquivo serve para a identificação automática do teste pelo Jest, sendo uma boa prática, pois facilita sua identificação.

Além do Jest, será utilizado também o Supertest, uma ferramenta que simplifica a criação de testes para APIs HTTP, sem a necessidade de iniciar um servidor local.

**Continuando...**

A seguir será feita a instalação do Jest e Supertest. No terminal, digite:

	`npm install --save-dev Jest Supertest`

**Obs: ao utilizar "--save-dev", as dependências são definidas como dependências de desenvolvimento, pois elas não são necessárias para o código funcionar no lado do usuário, apenas para o desenvolvedor. **.

Agora, será feita a importação do módulo app do Express que está no arquivo index.js e do Supertest:

	`const supertest = require("supertest")
	const app = require("./index.js")`

Será criada uma instância do Supertest que interage com o app:

	`const request = supertest(app);`

Ainda no arquivo de testes, será criado o teste para a rota POST que retorna o código 201:

	`test("Deve retornar 201 e um json no POST /produtos", async function (){
	const response = await request.post("/produtos")
		.send({nome:"Banana", preco: 15.00});
	expect(response.status).toBe(201)
	expect(response.headers['content-type']).toMatch(/json/)
	}) `

Na primeira linha, é feita uma breve descrição do comportamento esperado do teste, utilizando uma função assíncrona para sua realização. Na constante "response", é definida uma requisição do tipo POST para o endpoint "/produtos", utilizando o método .send para enviar os dados do produto (no caso, uma banana com preço fictício de 15 reais). Nas linhas seguintes, em "expect", é definido o tipo de resposta esperada (response.status) como código 201 e, na linha posterior, o formato da resposta esperada, sendo JSON.

Pronto! O teste da rota POST retornando 201 foi feito! Agora, será realizado o teste que retorna o código 422. A estrutura será a mesma, apenas o status da resposta esperada será diferente, sendo 422, que ocorre caso o usuário não insira as informações devidas.

	`test("Deve retornar 422 e um JSON no POST /produtos", sync function(){
	const response = await request.post("/produtos")
		.send({});
	expect(response.status).toBe(422);
	expect(response.headers["content-type"]).toMatch(/json/);
	});`

**Agora, o teste que espera o retorno 422 foi feito! **

**Mas e Agora ? Como testamos de fato nossa API e verificamos que funcionou?**

![Gato programador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vae6kdp3s8pjjrk25xdg.jpg)

Vamos ao arquivo package.json (que é gerado automaticamente quando uma dependência é instalada) e definir um script para testes da seguinte maneira:

	`"test": "jest --watchAll"`

**OBS: o script acima deve ser criado dentro do array "scripts".**

Agora, volte ao arquivo de testes, abra o terminal e digite o script que foi adicionado:

	`npm run test`

Caso tudo ocorra com sucesso, a seguinte informação será exibida no terminal:

![Imagem de teste que passou](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s4kdkd1jbxo0byhmrjnw.png)

**É isso!!
Agradeço por você ter chegado até aqui! Qualquer dúvida só deixar logo abaixo😉**

Voçê também pode estar me seguindo no [Linkedin](https://www.linkedin.com/in/gabrielbarbosatech/)