<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabriel Barbosa</title>
    <description>The latest articles on DEV Community by Gabriel Barbosa (@gabrielsb18).</description>
    <link>https://dev.to/gabrielsb18</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1487494%2F6d90dee0-7dd5-4d70-aa13-a0695b692599.png</url>
      <title>DEV Community: Gabriel Barbosa</title>
      <link>https://dev.to/gabrielsb18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabrielsb18"/>
    <language>en</language>
    <item>
      <title>Testes de Integração</title>
      <dc:creator>Gabriel Barbosa</dc:creator>
      <pubDate>Mon, 13 May 2024 02:42:05 +0000</pubDate>
      <link>https://dev.to/gabrielsb18/testes-unitarios-21np</link>
      <guid>https://dev.to/gabrielsb18/testes-unitarios-21np</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; `npm install express`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Lembre-se de que é necessário instalar o Node juntamente com o gerenciador de pacotes npm.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora, será criado um arquivo index.js, onde será feita a importação do Express:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const express = require("express");`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após a importação, será criada uma instância do módulo Express:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const app = express();`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`app.listen(3333, function(){
    console.log("Servido funcionand!")
})`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora, o arquivo index.js será exportado:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`module.exports = app;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const express = require("express");
const produtos = [];`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Então, será implementada a rota POST:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const router = express.Router()`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Então iremos fazer a implementação da nossa rota POST:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`router.post("/produtos" function(req, res){
    if (req.body &amp;amp;&amp;amp; 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({});
})`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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 &amp;amp;&amp;amp; 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&lt;/p&gt;

&lt;p&gt;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({});".&lt;/p&gt;

&lt;p&gt;Por fim, o módulo de rotas será exportado:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`module.exports = router;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`cont routerProdutos = require("./router");
app.use(routerProdutos)`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuando...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A seguir será feita a instalação do Jest e Supertest. No terminal, digite:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`npm install --save-dev Jest Supertest`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;*&lt;em&gt;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. *&lt;/em&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const supertest = require("supertest")
const app = require("./index.js")`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Será criada uma instância do Supertest que interage com o app:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`const request = supertest(app);`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ainda no arquivo de testes, será criado o teste para a rota POST que retorna o código 201:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`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/)
}) `
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`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/);
});`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;*&lt;em&gt;Agora, o teste que espera o retorno 422 foi feito! *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas e Agora ? Como testamos de fato nossa API e verificamos que funcionou?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvae6kdp3s8pjjrk25xdg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvae6kdp3s8pjjrk25xdg.jpg" alt="Gato programador" width="700" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`"test": "jest --watchAll"`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;OBS: o script acima deve ser criado dentro do array "scripts".&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora, volte ao arquivo de testes, abra o terminal e digite o script que foi adicionado:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`npm run test`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Caso tudo ocorra com sucesso, a seguinte informação será exibida no terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4kdkd1jbxo0byhmrjnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4kdkd1jbxo0byhmrjnw.png" alt="Imagem de teste que passou" width="468" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;É isso!!&lt;br&gt;
Agradeço por você ter chegado até aqui! Qualquer dúvida só deixar logo abaixo😉&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voçê também pode estar me seguindo no &lt;a href="https://www.linkedin.com/in/gabrielbarbosatech/"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>jest</category>
      <category>tdd</category>
    </item>
  </channel>
</rss>
