DEV Community

Cover image for Testes de Integração
Gabriel Barbosa
Gabriel Barbosa

Posted on • Updated on

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

Top comments (0)