Testes de Integração
Gabriel Barbosa
Posted on May 13, 2024
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?
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:
É 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
Posted on May 13, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.