Testes de Integração

gabrielsb18

Gabriel Barbosa

Posted on May 13, 2024

Testes de Integração

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`
Enter fullscreen mode Exit fullscreen mode

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");`
Enter fullscreen mode Exit fullscreen mode

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

`const app = express();`
Enter fullscreen mode Exit fullscreen mode

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!")
})`
Enter fullscreen mode Exit fullscreen mode

Agora, o arquivo index.js será exportado:

`module.exports = app;`
Enter fullscreen mode Exit fullscreen mode

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 = [];`
Enter fullscreen mode Exit fullscreen mode

Então, será implementada a rota POST:

`const router = express.Router()`
Enter fullscreen mode Exit fullscreen mode

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({});
})`
Enter fullscreen mode Exit fullscreen mode

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;`
Enter fullscreen mode Exit fullscreen mode

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)`
Enter fullscreen mode Exit fullscreen mode

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`
Enter fullscreen mode Exit fullscreen mode

*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")`
Enter fullscreen mode Exit fullscreen mode

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

`const request = supertest(app);`
Enter fullscreen mode Exit fullscreen mode

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/)
}) `
Enter fullscreen mode Exit fullscreen mode

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/);
});`
Enter fullscreen mode Exit fullscreen mode

*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

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"`
Enter fullscreen mode Exit fullscreen mode

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`
Enter fullscreen mode Exit fullscreen mode

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

Imagem de teste que passou

É 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

💖 💪 🙅 🚩
gabrielsb18
Gabriel Barbosa

Posted on May 13, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Testes de Integração
testing Testes de Integração

May 13, 2024