<?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: Luiz Eduardo Cardozo</title>
    <description>The latest articles on DEV Community by Luiz Eduardo Cardozo (@luizeduardocardozo).</description>
    <link>https://dev.to/luizeduardocardozo</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%2F460185%2F026615d8-cb37-4c4e-890c-58d9ab864ad4.png</url>
      <title>DEV Community: Luiz Eduardo Cardozo</title>
      <link>https://dev.to/luizeduardocardozo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luizeduardocardozo"/>
    <language>en</language>
    <item>
      <title>Padrões de commits - Como e por que?</title>
      <dc:creator>Luiz Eduardo Cardozo</dc:creator>
      <pubDate>Sat, 19 Sep 2020 19:08:08 +0000</pubDate>
      <link>https://dev.to/luizeduardocardozo/padroes-de-commits-como-e-por-que-1nd8</link>
      <guid>https://dev.to/luizeduardocardozo/padroes-de-commits-como-e-por-que-1nd8</guid>
      <description>&lt;p&gt;Se existe algo que programadores gostam (ou, ao menos deveriam gostar mais) são as chamadas “boas práticas”. Elas existem com a finalidade de padronizar o desenvolvimento, criando alguns padrões visuais que exigem menos esforço para se reconhecer do que se trata. Isso além de agilizar o desenvolvimento, também evita erros, aumentando a pouco falada “eficiência”.&lt;/p&gt;

&lt;p&gt;Já foram criados padrões para nome de variáveis, nomes de funções, classes… Mas ainda existe um mundo caótico lá fora: as mensagens de commit do git.&lt;/p&gt;

&lt;p&gt;Para não perder o costume, vamos a nossa historinha:&lt;/p&gt;

&lt;p&gt;Faz alguns poucos meses onde eu e meu time estamos trabalhando em um e-commerce. Estavamos quase ficando sem prazo por conta de alguns imprevistos, então decidimos partir para o stop-the-line para agilizar o processo e isso não acabar se tornando um problema para a nossa fábrica.&lt;/p&gt;

&lt;p&gt;Foram 3 dias de trabalho incessante: cerca de 7 programadores trabalhando em cima do mesmo código. Milhões de commits e várias branches abertas, para gerenciar os conflitos.&lt;/p&gt;

&lt;p&gt;Por fim, terminamos o projeto bem antes do prazo previsto, com uma sobra de umas duas semanas, que destinamos a testes, antes do deploy final.&lt;/p&gt;

&lt;p&gt;Faltando cerca de 3 dias para o lançamento, o Stakeholder do projeto me liga (eram umas 4 da manhã, ele tinha costume de fazer isso) me falando que “as fotos estavam repetidas no site.&lt;/p&gt;

&lt;p&gt;Explicando melhor, na página de produto tinha um carrossel. Fazíamos um request à uma api externa, que nos retornava os dados do produto em questão. Por fim, dentro da resposta, possuíam as fotos que o produto deveria apresentar na página inicial. Esses links eram passados para o componente do carrossel.&lt;/p&gt;

&lt;p&gt;Bom, o primeiro passo que tive foi lógico: ao final de cada turno, faço um “checklist” de requisitos do sistema, colocando a data. Vi que a última vez que testei o carrossel, foi a cerca de 5 dias antes. Então, fui ao github, e passei a ler todos os commits de cinco dias atrás, caçando algum santo que tenha feito uma modificação no carrossel. Infelizmente, os commits estavam uma bagunça, e eu me vi às 5:30 da manhã, abrindo cada um dos 500 commits feitos, um a um, e lendo os arquivos modificados…&lt;/p&gt;

&lt;p&gt;(In)felizmente, não foi culpa nossa… Houve uma falta de sincronia nos serviços da API, e ela acabava fornecendo os dados errados. Coisa que pode ser resolvida com um simples “refresh” no sistema.&lt;/p&gt;

&lt;p&gt;Esse fato me fez refletir bastante. Sou um fã assumido de Lean (o modelo de gestão, no caso) e tento aplicar em tudo o que posso. Os commits caóticos me fizeram desperdiçar tempo, e desperdício é o pecado número um do Lean.&lt;/p&gt;

&lt;p&gt;Comecei então a bolar métodos de commits que fossem mais claros. Esses métodos têm sido desenvolvidos desde então. Hoje, irei contar um pouco dos meus aprendizados com commits, e como eles facilitam a vida de um tech-leader, ou qualquer desenvolvedor que lide com um equipe grande.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo começa no desenvolvimento
&lt;/h2&gt;

&lt;p&gt;Como você, caro leitor, provavelmente é programador, vamos começar pelo código!&lt;/p&gt;

&lt;p&gt;Cada empresa tem a sua particularidade no uso do git: uma branch para cada programador, para cada fase, cada sprint, uma só branch de desenvolvimento, dar push na master... &lt;/p&gt;

&lt;p&gt;Como utilizamos o Jira para nos organizar, na empresa onde sou tech-leader, implementei a regra de que cada item do Jira deve possuir uma branch só para ele, nomeada de acordo com o nome sugerido no Jira.&lt;/p&gt;

&lt;p&gt;Vamos supor que estamos trabalhando no terceiro item do backlog, cujo o nome é PROJ-003. Então, você deverá dar push todo o seu código relativo a esse item do backlog nessa branch.&lt;/p&gt;

&lt;p&gt;Porém, há um adendo: na organização, foco é o primeiro passo.&lt;/p&gt;

&lt;p&gt;Faça commit APENAS de itens relativos à branch. Caso ache algum arquivo que precise de modificações, mas não é da alçada daquele item do backlog, não faça commit dessa modificação na branch que está trabalhando atualmente: ou abra uma nova, ou faça na branch correta, depois volte para a sua branch que estava trabalhando.&lt;/p&gt;

&lt;p&gt;Isso evita o problema número um que tive com o e-commerce: se algo quebrar em algum ponto, facilmente poderemos rastrear se aquele arquivo foi, ou não, modificado: basta procurar na mensagem de commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como eu devo organizar a minha mensagem?
&lt;/h2&gt;

&lt;p&gt;Bom, existe n formas de se fazer isso. O importante é combinar com a sua equipe um padrão, para que se torne algo “homogêneo” e suficientemente informativo.&lt;/p&gt;

&lt;p&gt;Em umas experiências anteriores, nosso chefe nos instruiu a realizar commit apenas após terminar todo o item do backlog. Isso reduz o número de commits, fato, mas aumenta a quantidade de itens commitados, o que é péssimo, já que você vai ter um trabalho bem grande quando for rastrear algum bug.&lt;br&gt;
Em um trabalho posterior, a equipe chegou à conclusão de que o melhor era commitar a cada arquivo modificado, explicando as modificações no arquivo. Isso gera MUITOS problemas:&lt;br&gt;
Quantidade enorme de commits: em caso de bug, só com ctrl + f para achar palavras chaves;&lt;br&gt;
Texto de commit enorme: na hora do desespero, você dificilmente vai conseguir ler tudo;&lt;br&gt;
Prejudica a produtividade: tanto para quem está codando, quanto para quem está tendo que ler os commits, às 5:30 da manhã, com um Stakeholder gritando no telefone;&lt;/p&gt;

&lt;p&gt;Agilidade pouco importa no desenvolvimento, se você não tem precisão: Melhor um software bem feito, que uma manutenção rápida.&lt;/p&gt;

&lt;p&gt;A maneira mais eficiente que conseguimos chegar de realizar os commits são baseadas em dois eventos:&lt;/p&gt;

&lt;p&gt;Quando algo funcional novo foi adicionado;&lt;br&gt;
Quando um bug é corrigido, ou uma funcionalidade foi refatorada&lt;/p&gt;

&lt;p&gt;Isso porque: uma funcionalidade, dependendo da arquitetura do sistema, deve interagir com o restante do código. Possivelmente, essa nova funcionalidade pode acabar causando algum “unexpected behavior”. Citar cada funcionalidade nova nos commits, é citar cada ponto de interação do sistema, o que facilita o rastreio do causador do problema.&lt;/p&gt;

&lt;p&gt;Já diziam os magos da programação: programar é a arte de gerar bug no código. Eles sempre irão ocorrer, não tem jeito. Eventualmente, a correção de um bug pode gerar um outro bug. Isso se você considerar que o sistema possui testes automatizados, se não, esse “pode gerar um outro bug” se torna um “certamente irá gerar vários outros bugs”, pois é extremamente difícil de manter um padrão de desenvolvimento, se não foi você quem começou ele.&lt;/p&gt;

&lt;p&gt;Citar as correções feitas pode facilitar a rastrear algum bug que possa ter ocorrido durante a refatoração de alguma parte do código.&lt;/p&gt;

&lt;p&gt;Quanto ao tamanho da mensagem, é relativo: dê preferência por mensagens curtas e objetivas, porém pouco genéricas. Isso ajuda a manter a produtividade durante o processo de escrever código e, é claro, ajuda quem vai ter que rastrear as modificações.&lt;/p&gt;

&lt;p&gt;A primeira parte do commit é o motivo dele estar sendo feito. Para eu e minha equipe, temos apenas 5 motivos para isso: adição de algo novo (add), remoção de algo novo velho (remove), correção de um bug (bug-fix) e refatoração de algum código (refact).&lt;/p&gt;

&lt;p&gt;Isso ajuda a, no momento que você ver a mensagem de commit, você já ter uma ideia do que houve ali, e se aquilo pode estar ou não integragindo com o seu problema. &lt;br&gt;
A segunda parte é a mais complexa de todas: a mensagem.&lt;br&gt;
A mensagem deve ser curta, no máximo 72 caracteres, e deve ser imperativa. Deve resumir as modificações e especificar o que foi feito e, principalmente, aonde foi feito.&lt;/p&gt;

&lt;p&gt;Deve-se também ter cuidado para a mensagem não ficar redundante com a primeira parte. Não existe problemas em se repetir, mas lembre-se dos 72 caracteres. Palavras redundantes são desperdício de tempo e espaço.&lt;/p&gt;

&lt;p&gt;Ex:&lt;br&gt;
    Mudanças no código - Errado. Vago de mais, que mudanças? Em que parte do código?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refact: mudanças no código - Errado, porém melhor. Tá, a mudança foi um refatoramento, mas em que parte do código?

Refact: mudanças no componente de produtos - Errado, porém já diz bem mais. Já sabemos que foi um refatoramento, e que foi em um componente de produtos, mas qual foi esse componente?

Refact: mudanças no componente ProductCard - Errado, mas quase bom. Qual forams as mudanças?

Refact: troca do forEach por um map durante o preenchimento dos campos no componente ProductCard - Muito bom! Explica o que foi feito e aonde foi feito. O unico problema é que deveria ser menor…

Refact: forEach trocado por map para preencher campos no componente ProductCard - Perfeito! Pequeno e traz todas as informações necessárias!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Existem algumas ferramentas, como um lint para commits. Eu, particularmente, acho elas um pouco desnecessárias: a maioria te força a usar um idioma e acaba tirando um pouco da sua produtividade. Gosto mais que meu time seja livre, mas tenha conhecimento dos benefícios que seguir um padrão pode trazer.&lt;/p&gt;

&lt;p&gt;Esse foi o post hoje e, provavelmente, semana que vem irá sair mais uma parte da minha série de posts sobre testes automatizados. Estou ainda pesquisando materiais para tornar a segunda parte mais densa em conteúdos e, por conta disso, achei melhor postar algo mais “leve” hoje, para não ficarmos sem conteúdo.&lt;/p&gt;




&lt;p&gt;Bons estudos a todos!&lt;br&gt;
Luiz Eduardo Cardozo&lt;/p&gt;

</description>
      <category>github</category>
      <category>productivity</category>
      <category>agile</category>
    </item>
    <item>
      <title>Jest + TypeScript para quem nunca fez testes - Qual o básico que você precisa saber?</title>
      <dc:creator>Luiz Eduardo Cardozo</dc:creator>
      <pubDate>Sat, 12 Sep 2020 17:27:34 +0000</pubDate>
      <link>https://dev.to/luizeduardocardozo/jest-typescript-para-quem-nunca-fez-testes-qual-o-basico-que-voce-precisa-saber-527h</link>
      <guid>https://dev.to/luizeduardocardozo/jest-typescript-para-quem-nunca-fez-testes-qual-o-basico-que-voce-precisa-saber-527h</guid>
      <description>&lt;p&gt;Primeiramente, é interessante você entender qual a real necessidade de se realizar testes automatizados durante o desenvolvimento de alguma aplicação. &lt;/p&gt;

&lt;p&gt;Imagina que você está trabalhando em uma API. Você chama uma rota, passando alguns parâmetros para ela, então a rota chama um controlador que, através algumas operações xpto, te retorna uma informação. Pense nela como uma fábrica: você entra com matéria prima (request) e ela te retorna um produto (return).&lt;/p&gt;

&lt;p&gt;A entrada da fábrica, seria a rota que chamamos, o interior da máquina, o controlador, seus componentes internos as funções e, por fim, a saída seria o response.&lt;/p&gt;

&lt;p&gt;Assim como em uma máquina, para que uma determinada rota funcione bem, todos os seus componentes internos precisam estar funcionando corretamente: isso é, seguindo um padrão de “como funciona”.&lt;/p&gt;

&lt;p&gt;Imagine uma linha de produção de carros. Um belo dia, você realiza uma manutenção preventiva em um robô, cujo a função era apertar os parafusos das portas. Porém, sem notar, você acaba invertendo o sentido que a parafusadeira gira… Caos resume a sua linha de produção depois disso. Você irá perder horas de trabalho, tentando entender por que raios os carros estão saindo o parafuso frouxo.&lt;/p&gt;

&lt;p&gt;Esse caos poderia ser evitado de uma maneira muito simples: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;ao terminar uma manutenção, teste para saber se tudo está funcionando corretamente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bom, voltando ao mundo do software, imagine que durante o processo de desenvolvimento, você acaba modificando uma função… Talvez uma modificação simples, que só adicione um parâmetro à saída de uma função. Será que esse parâmetro extra vai quebrar algo no seu código?&lt;/p&gt;

&lt;p&gt;Os testes automatizados estão aí justamente para responder essa sua pergunta:com eles é possível checar, de maneira automatizada, todos os inputs e todos os outputs de pedaços do seu código, de forma que seja possível identificar problemas no seu código e corrigi-los rapidamente.&lt;/p&gt;

&lt;p&gt;Existem diversas filosofias de desenvolvimento que implementam testes: TDD, BDD, Unit Testing, ATDD… Como esse é apenas um post introdutório, não vou me ater a elas, buscando focar mais em introduzir os novatos nesse mundo de testes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo I - Afiando o machado
&lt;/h2&gt;

&lt;p&gt;Bom, irei partir do princípio de que você já tem todo um ambiente de TypeScript montado e, é claro, saiba ao menos um framework de NodeJS para construirmos algum exemplo. Eu irei utilizar o ExpressJS, por ser simples.&lt;/p&gt;

&lt;p&gt;Primeiramente, iremos instalar as ferramentas necessárias para iniciar o trabalho&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn install --D jest ts-jest @types/jest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Caso esteja de fato utilizando o TypeScript, é de suma importância instalar o ts-jest e os tipos do Jest.&lt;/p&gt;

&lt;p&gt;Depois de instalado, deveremos criar um arquivo de configurações para o Jest: jest.config.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;roots&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;&amp;lt;rootDir&amp;gt;/src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;transform&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;^.+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.tsx?$&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;ts-jest&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;span class="na"&gt;testRegex&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__/.*|(&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.|/)(test|spec))&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.tsx?$&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;moduleFileExtensions&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;ts&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;js&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Importante:&lt;br&gt;
Roots -&amp;gt; Aqui, você deve dizer aonde ficará o código fonte da sua aplicação. Por padrão, eu sempre crio uma pasta src dentro do projeto, para por todo código lá dentro.&lt;br&gt;
testRegex -&amp;gt; Aqui, será o regex que o jest irá utilizar para identificar se um arquivo é, ou não é, um arquivo que contém testes. Isso, porque não dizemos ao jest qual arquivo executar. Por padrão, ele sempre irá executar todos os testes que ele conseguir achar.&lt;/p&gt;

&lt;p&gt;Esse é um Regex “padrão”, ele irá buscar por arquivos que contenham o formato:&lt;/p&gt;

&lt;p&gt;Nome-do-teste.test.tsx&lt;br&gt;
Nome-do-teste.test.ts&lt;br&gt;
Nome-do-teste.spec.tsx&lt;br&gt;
nome-do-teste.spec.ts&lt;/p&gt;

&lt;p&gt;Observe também que ele irá buscar todos esses testes dentro da pasta &lt;strong&gt;tests&lt;/strong&gt;. Caso queira mudar, basta mudar essa sessão do Regex.&lt;/p&gt;
&lt;h2&gt;
  
  
  Passo II - Criando uma função que será testada
&lt;/h2&gt;

&lt;p&gt;Nossa função de testes será bastante simples, e eu irei implementá-la de uma maneira “não otimizada”, justamente para apresentar um caso de uso dos testes unitários.&lt;/p&gt;

&lt;p&gt;A função em questão deverá receber dois arrays, então somar a somatória desses arrays.&lt;/p&gt;

&lt;p&gt;Caso você esteja pensando “What the f*ck???” eu vou dar um exemplo prático&lt;/p&gt;

&lt;p&gt;sumTest( [1,2,3], [4,5,6] )&lt;/p&gt;

&lt;p&gt;sumArray( [ 1, 2, 3 ] ) + sumArray( [ 4, 5, 6 ] )&lt;/p&gt;

&lt;p&gt;sumArray( [ 1, 2, 3 ] ) = 1 + 2 + 3 = 6&lt;br&gt;&lt;br&gt;
sumArray( [ 4, 5, 6 ] ) = 4 + 5 + 6 = 15&lt;/p&gt;

&lt;p&gt;sumArray( [ 1, 2, 3 ] ) + sumArray( [ 4, 5, 6 ] ) = 6 + 15 = 21&lt;/p&gt;

&lt;p&gt;Logo:&lt;br&gt;&lt;br&gt;
sumTest( [1,2,3], [4,5,6] ) = sumArray( [ 1, 2, 3 ] ) + sumArray( [ 4, 5, 6 ] ) = 6 + 15 = 21&lt;/p&gt;

&lt;p&gt;Entendido o algorítimo, iremos implementá-lo da seguinte maneira:&lt;/p&gt;

&lt;p&gt;função sumTest =&amp;gt; recebe a,  recebe b :&lt;br&gt;
retorna função sumArray =&amp;gt; recebe a + função sumArray =&amp;gt; recebe b&lt;/p&gt;

&lt;p&gt;Em javascript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="nx"&gt;Const&lt;/span&gt; &lt;span class="nx"&gt;sumArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Let&lt;/span&gt; &lt;span class="nx"&gt;acumulator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;Return&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acumulator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="nx"&gt;Const&lt;/span&gt; &lt;span class="nx"&gt;sumTest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Return&lt;/span&gt; &lt;span class="nx"&gt;sumArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;sumArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&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;p&gt;Salvaremos esse arquivo dentro de:&lt;br&gt;
src/functions/sums.ts&lt;/p&gt;
&lt;h2&gt;
  
  
  Passo III - Criando os testes
&lt;/h2&gt;

&lt;p&gt;Bom, agora criaremos o nosso arquivo de testes para testar as funçẽs de soma.&lt;br&gt;
Para isso, vamos criar ele da seguinte forma:&lt;br&gt;
src/&lt;strong&gt;tests&lt;/strong&gt;/sums.test.tsx&lt;/p&gt;

&lt;p&gt;Inicialmente, devemos importar as funções que vamos testar para o nosso arquivo de testes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sumTest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sumArray&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora, usaremos a seguinte sintaxe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;explicação&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;função&lt;/span&gt; &lt;span class="nx"&gt;deve&lt;/span&gt; &lt;span class="nx"&gt;fazer&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// função sendo executada, e retornando para uma variável&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;variável&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="nx"&gt;esperado&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&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;p&gt;Vamos supor que você queira testar a seguinte função&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt;  &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sabemos que sum(1,1) deve dar 2, correto?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;Deve&lt;/span&gt; &lt;span class="nx"&gt;somar&lt;/span&gt; &lt;span class="nx"&gt;os&lt;/span&gt; &lt;span class="nx"&gt;numeros&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retornando&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sum&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;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;p&gt;Caso não seja, essa o jest irá acusar algum erro. Do contrário, irá passar no teste.&lt;/p&gt;

&lt;p&gt;Ok, agora vamos voltar ao que interessa, nossas funções de soma.&lt;/p&gt;

&lt;p&gt;sumArray =&amp;gt; ela soma um array. Logo, sabemos que se passarmos o array [1,2], ela deverá retornar 3, correto?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;Deve&lt;/span&gt; &lt;span class="nx"&gt;somar&lt;/span&gt; &lt;span class="nx"&gt;os&lt;/span&gt; &lt;span class="nx"&gt;numeros&lt;/span&gt; &lt;span class="nx"&gt;contidos&lt;/span&gt; &lt;span class="nx"&gt;no&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passados&lt;/span&gt; &lt;span class="nx"&gt;como&lt;/span&gt; &lt;span class="nx"&gt;argumento&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sumArray&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;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;p&gt;sumTest =&amp;gt; ela deve somar os itens contidos nos dois arrays, depois somar os resultados. Se passarmos [1,2] e [1,2] como argumento, ela deverá retornar 6, certo? (1 + 2) + (1 + 2)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;Deve&lt;/span&gt; &lt;span class="nx"&gt;somar&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;somatória&lt;/span&gt; &lt;span class="nx"&gt;dos&lt;/span&gt; &lt;span class="nx"&gt;itens&lt;/span&gt; &lt;span class="nx"&gt;contidos&lt;/span&gt; &lt;span class="nx"&gt;nos&lt;/span&gt; &lt;span class="nx"&gt;dois&lt;/span&gt; &lt;span class="nx"&gt;arrays&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sumTest&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;span class="mi"&gt;2&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;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&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;p&gt;Ao executar “jest” na pasta do projeto, ambas as funções irão ser testadas e, se nenhum erro foi cometido, irão passar normalmente. Do contrário, o próprio JEST irá te mostrar aonde função quebrou, mostrando o valor que era esperado, e o valor que foi recebido.&lt;/p&gt;

&lt;p&gt;BÔNUS - Refatorando o código sem quebrar nada.&lt;/p&gt;

&lt;p&gt;Iremos refatorar a função sumArray de uma maneira simplificada, através da função reduce.&lt;/p&gt;

&lt;p&gt;Como ela funciona?&lt;/p&gt;

&lt;p&gt;A função reduce é uma função que itera um array, tal qual o map, o forEach, o filter… A diferença é que ela possui um “acumulador”, que soma nele o item atual iterado, aplicado alguma regra (ou sem regras, como é no nosso caso). Terminando a iteração, ela retorna o acumulador.&lt;/p&gt;

&lt;p&gt;Podemos reescrever a função da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sumArray&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;acumulator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;acumulador&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Depois disso, basta rodar novamente o jest e ver que nada quebrou durante os testes.&lt;/p&gt;

&lt;p&gt;Esse foi um post curto, apenas para servir de introdução para uma série de posts a respeito de testes que irei fazer. Estudem ele e, em caso de dúvidas, pode entrar em contato comigo!&lt;/p&gt;

&lt;p&gt;Bons estudos!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
