<?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: Siqueira</title>
    <description>The latest articles on DEV Community by Siqueira (@themsiqueira).</description>
    <link>https://dev.to/themsiqueira</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%2F277172%2F91597c71-83ae-4f5b-aefb-58325091162f.png</url>
      <title>DEV Community: Siqueira</title>
      <link>https://dev.to/themsiqueira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/themsiqueira"/>
    <language>en</language>
    <item>
      <title>Como identificar gargalos de memória em uma aplicação nodejs 🤩</title>
      <dc:creator>Siqueira</dc:creator>
      <pubDate>Mon, 25 Jan 2021 04:03:17 +0000</pubDate>
      <link>https://dev.to/themsiqueira/como-identificar-gargalos-de-memoria-em-uma-aplicacao-nodejs-4cpd</link>
      <guid>https://dev.to/themsiqueira/como-identificar-gargalos-de-memoria-em-uma-aplicacao-nodejs-4cpd</guid>
      <description>&lt;p&gt;Hoje normalmente não nos preocupamos com consumo recursos ao desenvolver uma nova aplicação, porém quando temos como pauta a performance da aplicação as coisas se complicam.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/vxdbnWguC6X7VLN4cn/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/vxdbnWguC6X7VLN4cn/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando temos uma aplicação que não consegue lidar com consumo de memória, temos um problema.&lt;/p&gt;

&lt;p&gt;Pois quando ela não auto gerencia os recursos disponíveis, ela corre grande risco de ficar indisponível, e até perder dados.&lt;/p&gt;

&lt;p&gt;Um exemplo é uma aplicação que consome mensagens de alguma fila, se ela não controla a quantidade de mensagens a ser processada de acordo com os recursos disponíveis, ela pode acabar ultrapassado o limite de consumo e ser encerrada.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Busca pela solução:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Y3TRqTGdysJqkOizDF/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Y3TRqTGdysJqkOizDF/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando isso ocorre temos alguns problemas que podem ser elencados, sua aplicação pode estar com Memory Leaks, ou estar consumindo mais RAM do que o disponível.&lt;/p&gt;

&lt;p&gt;Tendo essas possibilidades em vista temos que investigar a execução da aplicação para coletar mais dados.&lt;/p&gt;

&lt;p&gt;O primeiro passo é montar seu ambiente local para reproduzir o cenário, porém antes de seguir com a reprodução devemos configurar um pacote que nos ajudará a coletar métricas da nossa aplicação o &lt;a href="https://www.npmjs.com/package/heapdump" rel="noopener noreferrer"&gt;heapdump&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A instalação e configuração é bem simples conforme abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fdng1xnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fdng1xnj.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rode a aplicação utilizando o seguinte comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

env NODE_HEAPDUMP_OPTIONS=nosignal node app.js


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após a configuração chegou a hora de encontrar o problema, ao rodar a aplicação temos como objetivo leva-la ao limite, após estourar o uso dos recursos e encerrar, a aplicação terá gerado um relatório de uso de recursos, você encontrará na pasta raiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FnFax96V.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FnFax96V.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para que possamos identificar exatamente onde ocorre o problema também colete dados da aplicação no ponto de execução você acredita não ter gargalos.&lt;/p&gt;

&lt;p&gt;E com isso podemos usar o chrome dev tools para visualizar o relatório conforme abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fk8DwHGC.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fk8DwHGC.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a importação temos acesso as métricas de consumo de memória da aplicação, devemos ficar atentos a alguns indicadores.&lt;/p&gt;

&lt;p&gt;A linha do tempo, com ele você pode diagnosticar o uso excessivo de memória, para identificar os pontos do gargalo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F0UG40zH.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F0UG40zH.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O gráfico que você vê exibirá a memória alocada para seu aplicativo. Se acontecer de estar consumindo uma quantidade cada vez maior disso ao longo do tempo (sem nunca cair), é uma indicação de que você pode ter um vazamento de memória(Memory Leak).&lt;/p&gt;

&lt;p&gt;O perfil de um aplicativo saudável deve se parecer mais com uma curva dente de serra, pois a memória é alocada e depois liberada quando o coletor de lixo entra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fau80Yyd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fau80Yyd.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de suspeitar que há um vazamento de memória, o profiler Heap pode ser usado para descobrir a origem do vazamento.&lt;/p&gt;

&lt;p&gt;Encontrar problemas de memória mesmo com as métricas é complicado mas para começar é a visualização Resumo do perfilador de heap. Você pode então comparar os heaps snapshots coletados para confirmar quais alocações foram feitas junto com seu impacto na memória.&lt;/p&gt;

&lt;p&gt;Em cada snapshot temos o consumo total de memória:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F4FpeBRR.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F4FpeBRR.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após selecionar o snapshot desejado podemos ver todos tipos de variáveis e suas quantidades criadas durante a execução do app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FqtErlhJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FqtErlhJ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Devemos ficar atentos a dois indicadores Shallow Size, que representa o tamanho do objeto alocado em bytes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FOZQp1dP.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FOZQp1dP.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E additional retained size que é o tamanho retido dos objetos, ou seja parte dos objetos que não é limpa com garbage collector.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FVQ8puKl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FVQ8puKl.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom agora que estamos cientes do indicadores e temos dois relatórios em mãos temos como proximo passo comparar os dois.&lt;/p&gt;

&lt;p&gt;Ao comparar temos como identificar partes do código que utilizar uma quantidade de memória maior. A investigação nem sempre é assertiva, porém ela nos da uma noção de onde atacar.&lt;/p&gt;

&lt;h2&gt;
  
  
  A solução:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/5bivKwxhVzshNk2Rjw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/5bivKwxhVzshNk2Rjw/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com todos os dados em mãos devemos implementar uma solução vamos usar como exemplo uma aplicação que consome mensagens de uma fila irrestritamente conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FLzHt3y1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FLzHt3y1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao identificar que o gargalo é no consumo uma saída é gerenciar o consumo de mensagens de acordo com memória atual usada, e fazer isso utilizando a função "memoryUsage" nativa do &lt;a href="https://nodejs.org/api/process.html#process_process_memoryusage" rel="noopener noreferrer"&gt;nodejs&lt;/a&gt;, essa função retorna o objeto abaixo: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

{
  rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472,
  external: 49879,
  arrayBuffers: 9386
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Para otimizar o uso de memória iremos consumir mensagens com base no indicador "heapUsed" que retorna a quantidade de memória alocada no momento. E também com base no total de memória disponível que pode ser obtido através da função "totalmem" presente dentro do modulo &lt;a href="https://nodejs.org/api/os.html#os_os_totalmem" rel="noopener noreferrer"&gt;os&lt;/a&gt;, essa função retorna o total de memória em bytes disponível no ambiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FA2TIC6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FA2TIC6a.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No caso acima utilizamos a seguinte estratégia, antes de consumir uma mensagem verificamos o uso total de memória caso esteja dentro do limite seguro a aplicação segue com o processo, caso contrario ela espera o uso da memória diminuir para voltar a processar as mensagens.&lt;/p&gt;

&lt;p&gt;Essa é uma das formas de controlar facilmente o uso de memória dentro de uma aplicação nodejs.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado até a próxima!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l4pTjOu0NsrLApt0Q/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l4pTjOu0NsrLApt0Q/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>performance</category>
      <category>node</category>
    </item>
    <item>
      <title>How can i config tests in nodejs api with jest</title>
      <dc:creator>Siqueira</dc:creator>
      <pubDate>Tue, 14 Jan 2020 22:42:07 +0000</pubDate>
      <link>https://dev.to/themsiqueira/how-can-i-config-tests-in-nodejs-api-with-jest-44ll</link>
      <guid>https://dev.to/themsiqueira/how-can-i-config-tests-in-nodejs-api-with-jest-44ll</guid>
      <description>&lt;p&gt;Before we start the config we need to now some things:&lt;/p&gt;

&lt;h1&gt;
  
  
  Why test my app? 🤔
&lt;/h1&gt;

&lt;p&gt;To make your service scalable, and more consistent!&lt;/p&gt;

&lt;h1&gt;
  
  
  What is jest? 💭
&lt;/h1&gt;

&lt;p&gt;Because is the most complete and easy to use!&lt;/p&gt;

&lt;p&gt;First of all you need to installing the packages below on your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jest the test framework:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yarn add jest &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;jest types is a inteliscense to use jest:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yarn add @types/jest &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Supertest is a framework to simulate http requisitions:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yarn add supertest &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to make initial jest config.&lt;/p&gt;

&lt;p&gt;To do that we execute the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yarn jest &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that the console make some questions to you, you need to answer like the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnxkfsnq0v8g2a970jqdc.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnxkfsnq0v8g2a970jqdc.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you will find a file called "jest.config.js" on your root project.&lt;/p&gt;

&lt;p&gt;The next step is ajust this config file like below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bail is the option we set to define the number of errors that make the tests break, in this case i always like to set one:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nx"&gt;bail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Clearmocks is the option that clear mocks after tests, this option we set true:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;clearMocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;collectCoverage this option enable or disable the coe coverage, i like to set as true:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;collectCoverage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;collectCoverageFrom this option define the path or file s to collect the coverage, usually i set the path where stay my business logic:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;collectCoverageFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/app/Controllers/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;coverageDirectory is the place where jest can put the coverage result, i usualy put coverage inside the test folder:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nx"&gt;coverageDirectory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__tests__/coverage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;coverageReporters this option set the type of reporters for coverage result, i like to user reports below:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nx"&gt;coverageReporters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lcov&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;testMatch this option set the test files extensions:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;testMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/__tests__/**/*.test.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can create the folder structure as the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh820vkbzc7w0hxrvdi4z.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh820vkbzc7w0hxrvdi4z.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that is it, now you reandy to starting test your api with jest!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/cI45LEPRoFQhLVq7AB/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/cI45LEPRoFQhLVq7AB/giphy.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to document a nodejs api with apidoc</title>
      <dc:creator>Siqueira</dc:creator>
      <pubDate>Mon, 06 Jan 2020 18:21:55 +0000</pubDate>
      <link>https://dev.to/themsiqueira/document-a-api-nodejs-with-apidoc-69k</link>
      <guid>https://dev.to/themsiqueira/document-a-api-nodejs-with-apidoc-69k</guid>
      <description>&lt;h2&gt;
  
  
  What is "apidoc" ?
&lt;/h2&gt;

&lt;p&gt;Apidoc is a package to create documentation for api from notes in your source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where can i use it?
&lt;/h2&gt;

&lt;p&gt;The service is compatible with any programming language that allow block documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/UurA7STcw7JeZWRs3p/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/UurA7STcw7JeZWRs3p/giphy.gif" alt="Alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How can i use ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First of all you need to configuring the environment:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;install node from the link "&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;https://nodejs.org/en/&lt;/a&gt;"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;install apidoc by command line below:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Now we can start configure the project:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;install grunt-apidoc "npm install grunt-apidoc --save-dev" &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grunt is a task generator to apidoc&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On your root of your project you need to create a "Grunfile.js"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your Gruntfile you need to add the options below to config the
destination path to apidoc:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; apidoc: {
   myapp: {
     src: "app/",
     dest: "apidoc/"
   }
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;After that you need to create a file called "apidoc.json" to include information about your project:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; {
   "name": "example",
   "version": "0.1.0",
   "description": "apiDoc basic example",
   "title": "Custom apiDoc browser title",
   "url" : "https://api.github.com/v1"
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs:. this file is optional, it is just to describe your project, and you can add this config in your package json if it's a node project, but I preffer a separated file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Now we can start making documentation.
&lt;/h3&gt;

&lt;p&gt;To start you just need to comment before your endpoint like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * @api {get} /user/:id Request User information
 * @apiName GetUser
 * @apiGroup User
 *
 * @apiParam {Number} id Users unique ID.
 *
 * @apiSuccess {String} firstname Firstname of the User.
 * @apiSuccess {String} lastname  Lastname of the User.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "firstname": "John",
 *       "lastname": "Doe"
 *     }
 *
 * @apiError UserNotFound The id of the User was not found.
 *
 * @apiErrorExample Error-Response:
 *     HTTP/1.1 404 Not Found
 *     {
 *       "error": "UserNotFound"
 *     }
 */
```


###Let's generate the documentation with the command bellow:



```
"apidoc -i myapp/ -o apidoc/ -t mytemplate/"
```



We need to pass in the command three arguments, first the folder where we can search the comments, second the output and in the end if we make a template the path to template, the final result is the image below:

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/h4dbhol10xri3kac2nfh.JPG)

This is my first post on dev.to, I hope it was of any help, any questions or suggestions just comment below!

 ![Alt Text](https://media.giphy.com/media/3o6fJ1l3Wr1ugMu1Rm/giphy.gif)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
