<?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>Forem: Vanessa Nascimento</title>
    <description>The latest articles on Forem by Vanessa Nascimento (@vanscript).</description>
    <link>https://forem.com/vanscript</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%2F419242%2F1756f5e8-69f5-4ae5-a34e-2165b1c5bc33.jpg</url>
      <title>Forem: Vanessa Nascimento</title>
      <link>https://forem.com/vanscript</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vanscript"/>
    <language>en</language>
    <item>
      <title>Qual a diferença entre require e import numa aplicação JS?</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Sat, 24 Feb 2024 11:26:44 +0000</pubDate>
      <link>https://forem.com/vanscript/qual-a-diferenca-entre-require-e-import-numa-aplicacao-js-6ga</link>
      <guid>https://forem.com/vanscript/qual-a-diferenca-entre-require-e-import-numa-aplicacao-js-6ga</guid>
      <description>&lt;p&gt;O &lt;em&gt;require&lt;/em&gt; e o &lt;em&gt;import&lt;/em&gt; são duas formas de importar módulos em JavaScript, mas possuem diferenças em relação à sua sintaxe e principalmente ao contexto em que são utilizados.&lt;/p&gt;

&lt;p&gt;O "&lt;em&gt;require&lt;/em&gt;" é uma forma de importar módulos que pertence ao &lt;strong&gt;CJS&lt;/strong&gt; (&lt;strong&gt;CommonJS&lt;/strong&gt;), um padrão utilizado no Node.js. Ele é utilizado em versões mais antigas do JavaScript, como o ES5. A sintaxe para utilizar o &lt;em&gt;require&lt;/em&gt; é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modulo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nome-do-modulo&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;Já o "&lt;em&gt;import&lt;/em&gt;" é uma forma de importar módulos que pertence ao &lt;strong&gt;ESM&lt;/strong&gt; (&lt;em&gt;&lt;strong&gt;EcmaScript Modules&lt;/strong&gt;&lt;/em&gt;) da versão do &lt;strong&gt;ECMAScript (ES6)&lt;/strong&gt;, e esse utilizado em versões mais recentes do JavaScript. A sintaxe para utilizar o &lt;em&gt;import&lt;/em&gt; é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;modulo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nome-do-modulo&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;Agora sobre o contexto que elas são utilizadas, essa é uma das principais diferenças entre o &lt;em&gt;require&lt;/em&gt; (CJS) e o &lt;em&gt;import&lt;/em&gt; (ESM). O &lt;em&gt;require&lt;/em&gt; é síncrono, ou seja, ele &lt;strong&gt;carrega os módulos de forma sequencial&lt;/strong&gt;, enquanto o &lt;em&gt;import&lt;/em&gt; é assíncrono, permitindo o &lt;strong&gt;carregamento de módulos de forma paralela&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Outra diferença é que o &lt;em&gt;import&lt;/em&gt; permite a utilização de recursos como o &lt;code&gt;import { recurso } from 'nome-do-modulo'&lt;/code&gt;, que possibilita &lt;strong&gt;importar apenas recursos específicos&lt;/strong&gt; de um módulo. Mas, o &lt;em&gt;import&lt;/em&gt; também permite a utilização de recursos como o &lt;code&gt;import * as modulo from 'nome-do-modulo'&lt;/code&gt;, que possibilita importar todos os recursos de um módulo em um objeto.&lt;/p&gt;

&lt;p&gt;É importante ressaltar que o &lt;code&gt;import&lt;/code&gt; é mais utilizado em projetos que utilizam o ECMAScript (ES6) e o Babel, enquanto o &lt;code&gt;require&lt;/code&gt; é mais utilizado em projetos que utilizam o CommonJS, como o Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como faço para utilizar &lt;em&gt;require&lt;/em&gt; ou &lt;em&gt;import&lt;/em&gt; na minha aplicação?
&lt;/h2&gt;

&lt;p&gt;Numa aplicação Node.js, para utilizar o ESM, vá até o &lt;code&gt;package.json&lt;/code&gt; da sua aplicação e insira essa propriedade na raiz do objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já para o &lt;em&gt;require&lt;/em&gt; (CJS) o Node.js considera ele como padrão. Vale que ressaltar que o CJS é definido como padrão de ferramenta de modularidade no Node.js mas nunca foi oficial da linguagem JavaScript. No entanto, a fim de conhecimento o &lt;code&gt;"type": "commonjs"&lt;/code&gt; indica a utilização do CJS no projeto. Podemos observar na imagem a seguir os valores da propriedade &lt;em&gt;type&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ds2cap0nalprkpo14lx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ds2cap0nalprkpo14lx.png" alt="Type recebe como valor o commonjs ou module" width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, espero ter esclarecido essa dúvida e que te ajude a definir o melhor ao seu projeto. Até a próxima! 😊✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Técnicas para Teste de Software e Boas Práticas</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Sun, 18 Feb 2024 17:53:43 +0000</pubDate>
      <link>https://forem.com/vanscript/introducao-ao-teste-de-software-fundamentos-e-tecnicas-3d1e</link>
      <guid>https://forem.com/vanscript/introducao-ao-teste-de-software-fundamentos-e-tecnicas-3d1e</guid>
      <description>&lt;p&gt;O &lt;strong&gt;teste de software&lt;/strong&gt; é uma etapa indispensável no desenvolvimento de sistemas, com o objetivo de garantir que o produto final funcione conforme o esperado. Ele envolve a execução do software para identificar possíveis falhas ou defeitos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Erros de runtime (como crashes);&lt;/li&gt;
&lt;li&gt;Resultados incorretos;&lt;/li&gt;
&lt;li&gt;Operações inacessíveis para o usuário;&lt;/li&gt;
&lt;li&gt;Respostas anormais;&lt;/li&gt;
&lt;li&gt;Senhas não ofuscadas ao digitar;&lt;/li&gt;
&lt;li&gt;Links quebrados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste artigo, vamos explorar as &lt;strong&gt;principais abordagens de testes de software&lt;/strong&gt;, incluindo técnicas específicas que garantem a qualidade e robustez do sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abordagens de Teste de Software 📚
&lt;/h2&gt;

&lt;p&gt;Existem diferentes formas de classificar os testes de software, e cada uma delas é adequada para diferentes tipos de cenários. Vamos dar uma olhada nas abordagens mais utilizadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teste Funcional (Caixa-Preta)&lt;/strong&gt;: Avalia a funcionalidade do software sem considerar seu código interno.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste Estrutural (Caixa-Branca)&lt;/strong&gt;: Analisa o código e a estrutura interna do software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste Baseado em Estados&lt;/strong&gt;: Avalia o comportamento de um sistema ao mudar de estado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste de Mutação&lt;/strong&gt;: Introduz alterações no código para verificar se os testes conseguem capturar essas mudanças.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste de Regressão&lt;/strong&gt;: Garante que novas mudanças não causem problemas em funcionalidades já existentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada uma dessas abordagens foca em diferentes aspectos do software, desde as funções do sistema até a análise detalhada do código. A seguir, veremos como cada técnica funciona e como você pode aplicá-las no seu processo de desenvolvimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teste Funcional (Caixa-Preta) 🎁
&lt;/h3&gt;

&lt;p&gt;O teste funcional, também conhecido como caixa-preta, foca nas funcionalidades do software sem levar em consideração sua implementação interna. Ou seja, você testa se o software faz o que deveria fazer com base nos requisitos, sem se preocupar com o código em si.&lt;/p&gt;

&lt;p&gt;Vamos supor que você tem uma calculadora em JavaScript que soma dois números. O teste funcional se concentraria em garantir que a função realiza a soma corretamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testa soma&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="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;calc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&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;calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&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;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nf"&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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;Se quiser saber mais sobre teste de caixa preta, &lt;a href="https://dev.to/vanscript/teste-funcional-ou-caixa-preta-black-box-uma-introducao-descomplicada-5c9l"&gt;há um artigo meu mais detalhado aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teste Estrutural (Caixa Branca) 📦
&lt;/h3&gt;

&lt;p&gt;O teste estrutural, ou caixa-branca, verifica se o código interno está funcionando corretamente. Aqui, o testador tem acesso ao código-fonte e testa o funcionamento interno da aplicação, verificando a lógica e a estrutura do código.&lt;/p&gt;

&lt;p&gt;O teste estrutural para a mesma função de soma verificaria se a lógica de soma está correta ao comparar o resultado da função com a soma feita manualmente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testa soma&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="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;calc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&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;calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&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;3&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;esperado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nf"&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;esperado&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;h3&gt;
  
  
  Teste Baseado em Estados 🌟
&lt;/h3&gt;

&lt;p&gt;O teste baseado em estados é útil para sistemas que possuem diferentes estados (como uma aplicação com login e logout). O objetivo é testar as transições entre esses estados.&lt;/p&gt;

&lt;p&gt;Imagine testar se o usuário foi logado corretamente. O teste verifica se, após a execução da função de login, o estado do usuário foi alterado para "logado".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testa estado do login&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="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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&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;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&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;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Teste de Mutação 🧬
&lt;/h3&gt;

&lt;p&gt;O teste de mutação cria versões modificadas do código original (chamados de mutantes) para verificar se os testes conseguem detectar essas mudanças. Se os testes não falharem diante do código alterado, isso indica que os testes precisam ser melhorados.&lt;/p&gt;

&lt;p&gt;No código abaixo, o operador de soma foi trocado por subtração. Se o teste não detectar essa diferença, ele falha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// código original&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;soma&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&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;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// código mutante&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;soma&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&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;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// operador '+' foi substituído por '-'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testa mutação na função soma&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="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;resultadoOriginal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;soma&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="mi"&gt;2&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;resultadoMutante&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;soma&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultadoOriginal&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultadoMutante&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;h3&gt;
  
  
  Teste de Regressão ⏮️
&lt;/h3&gt;

&lt;p&gt;O teste de regressão garante que mudanças recentes no código não quebrem funcionalidades já existentes. Após implementar novas funcionalidades ou corrigir bugs, o teste de regressão verifica se o sistema antigo ainda funciona corretamente.&lt;/p&gt;

&lt;p&gt;Aqui, testamos se a funcionalidade de soma ainda funciona após alterações no código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testa soma após implementação de nova funcionalidade&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="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;calc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&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;calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&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;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nf"&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O teste de software é uma prática essencial que garante a qualidade e confiabilidade dos sistemas. Ele envolve diversas abordagens e &lt;strong&gt;técnicas, como teste funcional, teste estrutural, teste de mutação,&lt;/strong&gt; entre outros, cada um com um foco específico no comportamento ou na estrutura do software.&lt;/p&gt;

&lt;p&gt;Adotar essas técnicas desde o início do desenvolvimento ajuda a identificar e corrigir problemas antes que eles se tornem mais complexos e caros de resolver. Lembre-se: &lt;strong&gt;testar bem é garantir um software de alta qualidade!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se gostou deste artigo, curta e compartilhe para que mais pessoas possam aprender sobre as melhores práticas de teste de software! 🚀✨&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>beginners</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Teste Funcional (Caixa-Preta) e Critérios de Teste: Guia Prático e Descomplicado</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Sun, 18 Feb 2024 17:29:41 +0000</pubDate>
      <link>https://forem.com/vanscript/teste-funcional-ou-caixa-preta-black-box-uma-introducao-descomplicada-5c9l</link>
      <guid>https://forem.com/vanscript/teste-funcional-ou-caixa-preta-black-box-uma-introducao-descomplicada-5c9l</guid>
      <description>&lt;p&gt;No desenvolvimento de software, a qualidade do produto final é essencial. Para garantir essa qualidade, utilizamos testes eficazes. Hoje, vamos explorar um tipo específico de teste: o teste funcional, também conhecido como teste de caixa-preta (black-box).&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Teste Funcional ou Caixa-Preta?
&lt;/h2&gt;

&lt;p&gt;Imagine testar uma caixa fechada: &lt;strong&gt;você sabe o que entra e o que deve sair, mas não precisa se preocupar com o que acontece dentro dela.&lt;/strong&gt; Esse é o princípio por trás do teste funcional.&lt;/p&gt;

&lt;p&gt;No teste de caixa-preta, o objetivo é verificar se o sistema funciona conforme esperado, sem olhar para o código interno. Aqui estão alguns pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foco externo&lt;/strong&gt;: O teste funcional olha para o comportamento do software de fora, verificando se ele faz o que deveria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseado em requisitos&lt;/strong&gt;: Os testes são projetados com base nos requisitos e especificações do software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrada e saída&lt;/strong&gt;: Você fornece entradas ao sistema e verifica se as saídas estão corretas, sem precisar saber como o sistema processa essas entradas internamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verificação de conformidade&lt;/strong&gt;: O teste verifica se cada funcionalidade está de acordo com o que foi especificado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo, no teste de caixa-preta, &lt;strong&gt;você não olha o código&lt;/strong&gt;. Você se concentra nas entradas e saídas, sem se preocupar com o que acontece por dentro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde os Testes Funcionais podem ser aplicados?
&lt;/h3&gt;

&lt;p&gt;Essa técnica pode ser usada em vários níveis de teste, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testes Unitários&lt;/strong&gt;: Testa partes específicas do software, como funções ou métodos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de Integração&lt;/strong&gt;: Verifica se diferentes partes do sistema funcionam bem juntas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de Sistema&lt;/strong&gt;: Testa o sistema completo para garantir que ele funcione como um todo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de Aceitação&lt;/strong&gt;: Garantem que o sistema atenda às expectativas do usuário final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A seguir, vamos aplicar a técnica black-box nos códigos, usando os critérios mais populares de teste de software com JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como planejar os testes?
&lt;/h2&gt;

&lt;p&gt;Para realizar bons testes, é necessário &lt;strong&gt;escolher os valores certos para testar&lt;/strong&gt;. Isso é feito criando casos de teste, que são cenários projetados para verificar se o software está funcionando conforme o esperado.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um caso de teste?
&lt;/h3&gt;

&lt;p&gt;Um caso de teste é um conjunto de condições e variáveis que determinam se o software está funcionando corretamente. &lt;strong&gt;A ideia é perguntar: "O software está fazendo o que deveria?"&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como encontrar todas as falhas de um software?
&lt;/h3&gt;

&lt;p&gt;Para garantir que o software funcione corretamente e encontrar o maior número de falhas possível, precisamos criar um conjunto de casos de teste eficaz, que deve ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finito e factível;&lt;/li&gt;
&lt;li&gt;Capaz de revelar o maior número de falhas perceptíveis;&lt;/li&gt;
&lt;li&gt;Capaz de revelar as falhas mais críticas ou relevantes do software.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Critérios de Teste
&lt;/h3&gt;

&lt;p&gt;Os critérios de teste são regras que determinam o que precisa ser verificado nos testes. Esses critérios ajudam a garantir que os testes cubram os cenários mais importantes e críticos.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Classe de Equivalência
&lt;/h4&gt;

&lt;p&gt;As classes de equivalência dividem os dados de entrada em grupos onde o comportamento do software deve ser igual para todos os membros. Ou seja, se um teste em uma classe funcionar, espera-se que todos os testes nessa classe se comportem da mesma forma.&lt;/p&gt;

&lt;p&gt;Por exemplo, em uma calculadora, podemos dividir as operações em classes de equivalência: soma, subtração, multiplicação e divisão. Em cada operação, esperamos que todos os valores válidos se comportem da mesma maneira.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo: tests/calculadora.test.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculadora&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../calculadora&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a soma de 2 + 2 é igual a 4&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&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;2&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a subtração de 5 - 2 é igual a 3&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtrai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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="nf"&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;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a multiplicação de 3 * 3 é igual a 9&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiplica&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a divisão de 10 / 2 é igual a 5&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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;h4&gt;
  
  
  2. Análise de Valor-Limite
&lt;/h4&gt;

&lt;p&gt;A análise de valor-limite complementa as classes de equivalência, verificando os extremos dos intervalos de entrada. Isso é importante porque muitos erros ocorrem nos limites dos dados.&lt;/p&gt;

&lt;p&gt;No exemplo da calculadora, podemos testar a função de divisão para garantir que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A divisão de um número positivo por outro positivo funcione corretamente.&lt;/li&gt;
&lt;li&gt;A divisão por zero retorne um erro, como esperado.&lt;/li&gt;
&lt;li&gt;A divisão de números negativos e positivos funcione corretamente.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo: tests/calculadora.test.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculadora&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../calculadora&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// análise valor-limite para a operação de divisão&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a divisão de 10 / 2 é igual a 5&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a divisão de 10 / 0 retorna um erro&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&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;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Divisão por zero não é permitida&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="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a divisão de -10 / 2 é igual a -5&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&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="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se a divisão de 10 / -2 é igual a -5&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&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;h4&gt;
  
  
  3. Análise de Causa-efeito
&lt;/h4&gt;

&lt;p&gt;A análise de causa-efeito examina a relação entre entradas (causas) e saídas (efeitos). O objetivo é verificar se a entrada correta gera a saída esperada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Causas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada item no carrinho tem um preço.&lt;/li&gt;
&lt;li&gt;O carrinho pode conter vários itens.&lt;/li&gt;
&lt;li&gt;Pode haver itens com quantidades diferentes ou preços diferentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Efeito:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O total do carrinho deve ser calculado corretamente com base nos preços e quantidades dos itens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para demonstrar a análise de causa-efeito, vamos criar diferentes causas (como carrinhos com diferentes combinações de itens) e observar os efeitos (o total calculado corretamente).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo: tests/calculaTotal.test.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculaTotal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../calculaTotal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verifica se o total do carrinho é calculado corretamente&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="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;carrinho&lt;/span&gt; &lt;span class="o"&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;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Camiseta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;preco&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Calça&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;preco&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sapato&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;preco&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculaTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;carrinho&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;350&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;h2&gt;
  
  
  Conclusão: A Jornada do Teste Funcional
&lt;/h2&gt;

&lt;p&gt;O teste funcional é uma ferramenta essencial para garantir que o software esteja funcionando corretamente. Ao aplicar critérios como &lt;strong&gt;classes de equivalência, análise de valor-limite e análise de causa-efeito&lt;/strong&gt;, você pode encontrar falhas e garantir a qualidade do seu software.&lt;/p&gt;

&lt;p&gt;Este artigo foi inspirado nas minhas anotações do curso de Teste de Software, em que fui aluna especial no mestrado da USP, com o professor Dr. Marcelo Eler. Espero que tenha sido útil para você e ajude na sua jornada no mundo dos testes de software. Até a próxima! ✌️✨&lt;/p&gt;

</description>
      <category>testing</category>
      <category>beginners</category>
      <category>programming</category>
      <category>blackbox</category>
    </item>
    <item>
      <title>Artigo Software Testing: A Research Travelogue - Resumo em PT-BR</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Mon, 12 Feb 2024 16:12:03 +0000</pubDate>
      <link>https://forem.com/vanscript/resumo-pt-br-do-artigo-software-testing-a-research-travelogue-1e0d</link>
      <guid>https://forem.com/vanscript/resumo-pt-br-do-artigo-software-testing-a-research-travelogue-1e0d</guid>
      <description>&lt;p&gt;Estou animada para compartilhar um resumo do artigo "&lt;strong&gt;&lt;em&gt;Software Testing: A Research Travelogue&lt;/em&gt;&lt;/strong&gt;". Quero passar o meu conhecimento que adquiri (e anotações que fiz) durante minha vida acadêmica de um jeito fácil de entender; neste caso foi para minha matéria de Teste de Software no mestrado como aluna especial em Sistemas de Informação na USP. Neste resumo, coloquei as informações mais importantes do artigo para ajudar a todos interessados em Teste de Software, seja estudante, profissional ou apenas curioso. Espero que este resumo seja útil, dando uma visão geral do progresso da pesquisa em Teste de Software e mostrando as maiores contribuições e desafios desde os anos 2000. Vamos lá! 🚀&lt;/p&gt;

&lt;p&gt;O Teste de Software é uma estratégia amplamente estudada para avaliar e melhorar a qualidade do software. O artigo tem como objetivo apresentar as pesquisas bem-sucedidas e desafios da área desde os anos 2000, contemplando o estado da arte e possíveis direções futuras.&lt;/p&gt;

&lt;p&gt;Em 2000, a Conferência Internacional de Engenharia de Software realizou sua primeira trilha "Futuro da Engenharia de Software", apresentando alguns &lt;em&gt;roadmaps&lt;/em&gt; para a área. Um deles era o "&lt;em&gt;Testing: A Roadmap&lt;/em&gt;", de autoria de &lt;strong&gt;Mary Jean Harrold&lt;/strong&gt;. A partir desse conceito, surgiu este diário de bordo do Teste de Software pelos autores, prestando homenagem à cientista e orientadora de PhD deles. 👸🏻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1034c0uhvzl2bm1xl9la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1034c0uhvzl2bm1xl9la.png" alt="Nuvem de palavras gerada a partir das respostas à pesquisa informal dos autores." width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Teste de Software continua sendo um dos tópicos mais pesquisados na Engenharia de Software. Mary Jean Harrold afirma em sua trilha que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A qualidade do software se tornará o critério de sucesso dominante na indústria de software."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Foi realizada uma pesquisa com mais de 50 pesquisadores da área de Teste de Software, com as seguintes perguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quais são as contribuições mais significativas para os testes desde os anos 2000, sejam suas ou de outros pesquisadores?&lt;/li&gt;
&lt;li&gt;Quais são os maiores desafios e oportunidades em aberto para futuras pesquisas nesta área?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;30 deles responderam à pesquisa com comentários onde as seguintes palavras foram as 5 mais citadas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Empírico&lt;/li&gt;
&lt;li&gt;Prático&lt;/li&gt;
&lt;li&gt;Regressão&lt;/li&gt;
&lt;li&gt;Ferramentas&lt;/li&gt;
&lt;li&gt;Simbólico&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As pesquisas dos contribuintes foram identificadas e classificadas como &lt;strong&gt;contribuições de pesquisa&lt;/strong&gt; e &lt;strong&gt;contribuição prática&lt;/strong&gt;, sendo que a última foi impulsionada mais pelo esforço industrial do que pelas atividades de pesquisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribuições de Pesquisa
&lt;/h2&gt;

&lt;p&gt;Existem 9 contribuições principais, que podem ser classificadas em 4 categorias principais:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Geração de entrada de teste automatizado
&lt;/h3&gt;

&lt;p&gt;As técnicas automatizadas de geração de entrada de teste tentam gerar um conjunto de valores de entrada para um programa ou componente de programa, geralmente com o objetivo de atingir alguma meta de cobertura ou alcançar um estado particular (como a falha de uma asserção).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execução Simbólica&lt;/strong&gt;: Executa um programa usando entradas simbólicas em vez de concretas. Em qualquer ponto da computação, o estado do programa consiste em um estado simbólico expresso em função das entradas, e as condições nas entradas que fazem com que a execução chegue a esse ponto são tipicamente expressas como um conjunto de restrições em forma conjuntiva chamada condição de caminho (PC).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseado em Busca&lt;/strong&gt;: Empresas como Microsoft e IBM usam técnicas de SBST. Essa técnica visa problemas de otimização, como encontrar o menor conjunto de casos de teste que cobrem todas as ramificações de um programa, tudo baseado em técnicas de otimização baseadas em meta-heurísticas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes Aleatórios&lt;/strong&gt;: Nos RTs, pesquisas vão além da geração de entrada aleatória simples, investigando abordagens mais sofisticadas e, até certo ponto, baseadas em princípios que possam melhorar a eficácia dessa técnica tradicional. Uma abordagem de RT é o teste aleatório adaptativo, que é uma classe de técnicas de teste projetadas para melhorar a eficácia de detecção de falhas do teste aleatório.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Estratégias de teste
&lt;/h3&gt;

&lt;p&gt;Estas incluem testes combinatórios, testes baseados em modelos e mineração e aprendizado a partir dos dados de campo. Entre eles, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testes Combinatórios&lt;/strong&gt;: Na prática, testar todas as configurações de um sistema, que pode ter um número enorme de configurações diferentes, é, na maioria das vezes, impossível devido ao tamanho do espaço de configuração. Os testadores devem, portanto, encontrar maneiras de amostrar esses espaços e realizar testes eficazes ao mesmo tempo que contêm o custo envolvido. O teste de interação combinatória (CIT) oferece estratégias para fazer isso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste Baseado em Modelo&lt;/strong&gt;: O teste baseado em modelo (MBT) envolve a derivação de conjuntos de testes a partir de uma ampla variedade de modelos de sistemas de software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mineração e Aprendizagem com Dados de Campo&lt;/strong&gt;: Atualmente, é cada vez mais comum coletar um amplo espectro de informações dinâmicas do software após ele ter sido implantado, enquanto ele é executado nas plataformas do usuário, e usar esse campo (ou telemetria) para apoiar as atividades de teste e melhorar sua eficácia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Teste de regressão
&lt;/h3&gt;

&lt;p&gt;Para realizar testes de regressão, os engenheiros geralmente começam reutilizando T, mas reutilizar todo T (a abordagem de reteste-tudo) pode ser excessivamente caro. Técnicas de seleção de teste de regressão (RTS) são muito incentivadas na pesquisa para diminuir o custo de execução de suítes de teste de regressão.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Estudos empíricos e suporte para eles
&lt;/h3&gt;

&lt;p&gt;As técnicas de teste são tipicamente heurísticas e seu desempenho pode diferir amplamente em diferentes cargas de trabalho e cenários de teste. Para entender e avaliar essas técnicas, métodos empíricos são, portanto, essenciais. A disponibilidade crescente de objetos de experimentação tem contribuído para este progresso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribuições Práticas
&lt;/h2&gt;

&lt;p&gt;Duas grandes contribuições nesse contexto são a definição de novos &lt;em&gt;frameworks&lt;/em&gt; para execução de testes, que melhoram e difundem drasticamente a arte do teste de software (como por exemplo o JUnit), e a ampla adoção de práticas inovadoras que promovem ciclos mais curtos no processo de teste, como a integração contínua (CI). Este conceito está ligado ao teste automatizado de &lt;em&gt;frameworks&lt;/em&gt; de execução, em que um conjunto de testes de regressão deve ser executado automaticamente no código para ajudar a garantir que a base de código permaneça estável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;Orso, Alessandro, and Gregg Rothermel. "&lt;em&gt;Software testing: a research travelogue _(2000–2014)." _Future of Software Engineering Proceedings&lt;/em&gt;. 2014. 117-132. &lt;a href="https://sites.cc.gatech.edu/fac/Alex.Orso/papers/orso.rothermel.ICSE2014-FOSE.pdf" rel="noopener noreferrer"&gt;Link do artigo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>tests</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
    <item>
      <title>O que são os containers? Uma introdução ao Docker</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Mon, 12 Feb 2024 15:11:48 +0000</pubDate>
      <link>https://forem.com/vanscript/o-que-sao-os-containers-uma-introducao-ao-docker-40k8</link>
      <guid>https://forem.com/vanscript/o-que-sao-os-containers-uma-introducao-ao-docker-40k8</guid>
      <description>&lt;h2&gt;
  
  
  📦 O que é &lt;em&gt;container&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Containers&lt;/em&gt; são como a mais nova moda no mundo da tecnologia, uma &lt;strong&gt;evolução da virtualização que permite rodar várias versões de um sistema operacional, cada uma na sua caixinha, no mesmo &lt;em&gt;host&lt;/em&gt;&lt;/strong&gt;. A popularidade chegou com o Docker em 2013, que trouxe uma interface amigável e uma plataforma para compartilhar &lt;em&gt;containers&lt;/em&gt; prontos para uso. Nascidos no universo Linux, os &lt;em&gt;containers&lt;/em&gt; são baseados em tecnologias como &lt;code&gt;namespaces&lt;/code&gt;, &lt;code&gt;cgroups&lt;/code&gt; e &lt;code&gt;chroot&lt;/code&gt;. O que são elas?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Os &lt;code&gt;namespaces&lt;/code&gt; garantem que &lt;strong&gt;cada &lt;em&gt;container&lt;/em&gt; tenha sua visão particular do sistema operacional&lt;/strong&gt;, como se fosse um adolescente em seu quarto. Isso inclui seu próprio espaço de nomes de processo, rede e sistema de arquivos montado. 🏘️&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os &lt;code&gt;cgroups&lt;/code&gt;, ou grupos de controle, são como a mamãe Linux &lt;strong&gt;controlando o uso de recursos&lt;/strong&gt; (como CPU, memória, disco I/O, rede, etc.) de um conjunto de processos, garantindo que ninguém passe dos limites. 🧐&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O &lt;code&gt;chroot&lt;/code&gt; é como se fosse um truque de mágica que muda o diretório raiz percebido por um processo, fazendo com que o processo e seus descendentes &lt;strong&gt;vejam um pedaço do sistema de arquivos como se fosse todo o sistema de arquivos&lt;/strong&gt;, tipo um tour guiado com acesso VIP.🚪&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Confuso? 🫠 Vamos à um exemplo então:&lt;br&gt;
Agora imagine que você está numa festa 🥳, nela há um buffet de mini pizzas individuais para cada convidado. Cada mini pizza é como um "&lt;em&gt;container&lt;/em&gt;", com sua própria "visão" da pizza (seus próprios ingredientes), isolada das outras, tipo os &lt;code&gt;namespaces&lt;/code&gt;. Além disso, é preciso garantir que cada pizza tenha uma quantidade equilibrada de ingredientes, tipo os &lt;code&gt;cgroups&lt;/code&gt;, que controlam o uso de recursos de cada &lt;em&gt;container&lt;/em&gt;. Por último, cada mini pizza está em sua própria bandeja de papel, o que impede que os ingredientes de uma pizza entrem em contato com os de outra. Isso é parecido com o &lt;code&gt;chroot&lt;/code&gt;, que dá um nível extra de isolamento. 🍕😋&lt;/p&gt;

&lt;p&gt;Então, a &lt;strong&gt;computação em &lt;em&gt;container&lt;/em&gt; permite que você rode várias versões isoladas do sistema operacional no mesmo &lt;em&gt;host&lt;/em&gt;, cada uma com seus próprios recursos e isolada das demais&lt;/strong&gt;, assim como você pode preparar várias mini pizzas, com suas especificidades, numa única festa. Ao contrário das máquinas virtuais (VMs), que emulam um ambiente completo, incluindo um sistema operacional convidado, os &lt;em&gt;containers&lt;/em&gt; compartilham o &lt;em&gt;kernel&lt;/em&gt; do sistema operacional hospedeiro, o que os torna mais leves e eficientes em termos de recursos. Essa abordagem oferece um equilíbrio entre isolamento e eficiência, sendo ideal para ambientes de desenvolvimento e implantação de aplicativos modernos.&lt;/p&gt;

&lt;p&gt;✨ PS.: Um mantra para sempre te acompanhar quando te perguntarem &lt;strong&gt;qual a diferença entre &lt;em&gt;máquina virtual&lt;/em&gt; (VM) e &lt;em&gt;container&lt;/em&gt; (Docker)&lt;/strong&gt;, tenha em mente que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na máquina virtual você emula um novo sistema operacional dentro do sistema operacional do &lt;em&gt;host&lt;/em&gt;. Já no &lt;em&gt;container&lt;/em&gt; você emula somente as aplicações e suas dependências.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que é o Docker?
&lt;/h2&gt;

&lt;p&gt;Docker é uma plataforma de código aberto que foi lançada em 2013 por uma empresa chamada dotCloud, que depois se tornou Docker Inc. 👩‍💻 O Docker foi &lt;strong&gt;construído com base na tecnologia de containerização do Linux, que já existia há um bom tempo, mas que ainda não tinha uma interface amigável&lt;/strong&gt; nem uma maneira padronizada de distribuir e rodar &lt;em&gt;containers&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O Docker chegou e transformou a tecnologia de &lt;em&gt;containers&lt;/em&gt; em algo mais amigável e acessível. Ele se tornou um verdadeiro mágico da tecnologia, &lt;strong&gt;empacotando software em pequenas unidades chamadas &lt;em&gt;containers&lt;/em&gt;&lt;/strong&gt;. Esses &lt;em&gt;containers&lt;/em&gt;, como vimos, são essas pequenas caixinhas que incluem tudo o que o software precisa para funcionar: código, tempo de execução, ferramentas do sistema, bibliotecas e configurações. É como se cada &lt;em&gt;container&lt;/em&gt; fosse uma pequena casa, com tudo o que você precisa para viver com conforto e autonomia. 🏡&lt;/p&gt;

&lt;h3&gt;
  
  
  Todo mundo tem um passado...
&lt;/h3&gt;

&lt;p&gt;Antes do Docker, já existiam algumas tecnologias que também trabalhavam com a ideia de isolar processos. Vamos falar um pouco sobre elas. Temos algumas como a LXC (Linux Containers), a Jails, a Solaris Zones e a VPS (Virtual Private Server).&lt;/p&gt;

&lt;p&gt;A LXC, ou Linux &lt;em&gt;Containers&lt;/em&gt;, é uma tecnologia que permite a criação e execução de múltiplas instâncias isoladas do Linux no mesmo &lt;em&gt;host&lt;/em&gt;. É como se cada instância fosse um apartamento em um grande prédio, cada um com suas próprias características e configurações. 🏢&lt;/p&gt;

&lt;p&gt;Jails é uma tecnologia introduzida pelo sistema operacional FreeBSD. Ela permite a execução de várias instâncias isoladas do FreeBSD no mesmo &lt;em&gt;host&lt;/em&gt;, como se fossem várias casas geminadas compartilhando o mesmo terreno. 🏘️ &lt;/p&gt;

&lt;p&gt;Solaris Zones, também conhecido como Solaris Containers, é uma tecnologia do sistema operacional Solaris. Ela permite a execução de múltiplas instâncias isoladas do Solaris no mesmo &lt;em&gt;host&lt;/em&gt;, como se fossem várias cabanas em uma ilha. 🛖🏝️ &lt;/p&gt;

&lt;p&gt;Já a VPS (Virtual Private Server) é uma tecnologia que permite a execução de múltiplas instâncias isoladas de um sistema operacional em um único servidor físico. É como se fossem várias lojas em um shopping, cada uma com seu próprio espaço. 🏬 &lt;/p&gt;

&lt;p&gt;O Docker, por sua vez, pegou essas tecnologias existentes e deu um passo adiante. Ele introduziu uma camada de abstração e automação que torna o processo de criação, implantação e execução de aplicações em &lt;em&gt;containers&lt;/em&gt; muito mais simples e eficiente. Além disso, &lt;strong&gt;o Docker introduziu um formato padronizado para a distribuição de aplicações em &lt;em&gt;containers&lt;/em&gt;,&lt;/strong&gt; facilitando o compartilhamento e a colaboração, como se fosse uma rede social de &lt;em&gt;containers&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Bom, espero que tenha gostado do artigo e que esclareça suas dúvidas dos princípios de Docker e o porquê é tão popular (e exigido para vagas em tech). 😄&lt;/p&gt;

&lt;p&gt;Um curso que me ajudou muito a entender, criar este artigo e usar o Docker nos meus projetos foi o &lt;a href="https://www.linuxtips.io/course/docker-essentials" rel="noopener noreferrer"&gt;Docker Essentials da LinuxTips&lt;/a&gt;. É gratuito e qualidade de primeira! 🥇&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Como instalar o Node.js no meu computador?</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Thu, 08 Feb 2024 20:31:57 +0000</pubDate>
      <link>https://forem.com/vanscript/como-instalar-o-nodejs-no-meu-computador-1gik</link>
      <guid>https://forem.com/vanscript/como-instalar-o-nodejs-no-meu-computador-1gik</guid>
      <description>&lt;p&gt;Arregace as mangas 🥭 e vamos começar. O primeiro passo é acessar &lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;https://nodejs.org/en&lt;/a&gt;. Para Windows e Mac, o processo é o mesmo. Para distribuições Linux, o processo muda um pouco, mas explicarei isso mais adiante. 🏃🏽‍♀️&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalando o Node.js no Windows ou MacOS
&lt;/h2&gt;

&lt;p&gt;Uma dúvida comum é sobre as duas opções, LTS e Current. Basicamente, LTS significa Long-Term Support, ou Suporte de Longo Prazo, que é &lt;strong&gt;uma versão mais segura e estável do Node&lt;/strong&gt;. A opção Current é a versão mais recente, com recursos mais recentes, mas que pode ainda conter alguns bugs. Eu sempre recomendo baixar a versão mais estável, a LTS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfwp2eyn3o5c8hs7pn0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfwp2eyn3o5c8hs7pn0u.png" alt="Site oficial do Node.js" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao abrir o Node.js Setup, o programa de instalação, prossiga e clique em 'Next' com força e depois ‘Install’. Nessas etapas ele instalará o Node.js, adicionará a documentação e o gerenciador de pacotes do Node, o npm, ao Path do seu sistema operacional. Dessa forma, você poderá acessar o Node pela linha de comando. O npm é muito útil aqui para baixar as bibliotecas do Node, por isso vamos instalar ele. E se esta parte não está totalmente clara, os próximos artigos irão esclarecer para você.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7l4wupiwtfpwx24opmsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7l4wupiwtfpwx24opmsx.png" alt="Node.js Setup no Windows, no MacOS é semelhante." width="494" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abra o Prompt de Comando/Terminal do seu computador, digite &lt;code&gt;node -v&lt;/code&gt; e se aparecer na linha debaixo a versão, significa que tudo deu certo! O Node.js está instalado com sucesso no seu computador. 💃🏾&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4n1cvqwmwue4sehedsq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4n1cvqwmwue4sehedsq.png" alt="v18.15.0 do Node.js indicando no terminal" width="630" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalando o Node.js para distribuições Linux
&lt;/h2&gt;

&lt;p&gt;Acesse &lt;a href="https://nodejs.org/en/download" rel="noopener noreferrer"&gt;https://nodejs.org/en/download&lt;/a&gt; e vá até o final da página e clique na opção 'Installing Node.js via package manager’ como mostra a imagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqokca66yyfsy0zkaran.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqokca66yyfsy0zkaran.png" alt="Página de download do nodejs.org" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao acessar esta página, você encontrará diversos tutoriais para vários sistemas operacionais, incluindo distribuições Linux. Ao clicar neles, será apresentado um tutorial específico para instalação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i2y7y12mba70wi286nq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i2y7y12mba70wi286nq.png" alt="Arch Linux, Debian, Ubuntu, openSUSE e diversos outros.&amp;lt;br&amp;gt;
" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Siga o tutorial adequado para o seu sistema operacional. Acesse o Terminal ou a Linha de Comando do seu computador e, assim como no Windows e MacOS, digite &lt;code&gt;node -v&lt;/code&gt;. Se a versão aparecer, significa que o Node está instalado com sucesso na sua máquina! 🕺🏼&lt;/p&gt;

&lt;p&gt;Qualquer dúvida, manda aqui nos comentários. 💕 Agora que estamos com o Node.js instalado, vamos baixar um bom editor de código e finalmente dar nossos primeiros passos. 🌈&lt;/p&gt;

</description>
      <category>node</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>O que é o Node.js?</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Thu, 08 Feb 2024 19:24:08 +0000</pubDate>
      <link>https://forem.com/vanscript/o-que-e-o-nodejs-670</link>
      <guid>https://forem.com/vanscript/o-que-e-o-nodejs-670</guid>
      <description>&lt;p&gt;Antes de entender o Node.js, precisamos saber o que é &lt;strong&gt;JavaScript&lt;/strong&gt;. Essa linguagem de programação faz uma página web ser dinâmica e interativa. Cada navegador tem um interpretador para processar o JavaScript. O Node.js nada mais é que um &lt;strong&gt;interpretador JavaScript&lt;/strong&gt;, que permite que o JavaScript seja usado fora do navegador. 😉&lt;/p&gt;

&lt;p&gt;Então, o Node.js é uma plataforma que deixa o JavaScript rodar no servidor. Ele usa o motor V8 do Google Chrome para interpretar o JavaScript, que é bem rápido e eficiente. Com o JavaScript funcionando além dos navegadores, ele pode ser usado para construir aplicações web, assim como PHP, C# ou Ruby; permite criar aplicativos para computador, aplicativos de comando, embarcados e aplicativos para celular. Isso só é possível por causa do Node.js, que expandiu o uso do JavaScript. 🤯&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que usar o Node.js?
&lt;/h2&gt;

&lt;p&gt;Existem várias razões maravilhosas para usar o Node.js. Primeiramente, o Node.js &lt;strong&gt;torna possível programar tanto o lado do cliente quanto o do servidor usando apenas JavaScript&lt;/strong&gt;. Isso pode aumentar a produtividade, pois os desenvolvedores não precisam mudar de linguagem ao mover-se entre o front-end e o back-end. Como sempre fui front-end em toda minha carreira, particularmente foi ótimo para mim ter essa transição mais leve do front para o back-end.&lt;/p&gt;

&lt;p&gt;Além disso, o Node.js é conhecido por sua &lt;strong&gt;alta performance&lt;/strong&gt;. Como mencionado anteriormente, ele usa o motor V8 do Google Chrome, que é extremamente rápido, está entre uma das tecnologias mais velozes. O Node.js consegue receber 10 vezes mais requisições por segundo, do que a linguagem PHP com as configurações básicas, um máximo né?! O Node.js também é assíncrono e orientado a eventos, o que significa que pode &lt;strong&gt;lidar com muitas conexões simultâneas sem perder velocidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finalmente, o &lt;strong&gt;Node.js tem uma comunidade de desenvolvedores ativa e vibrante&lt;/strong&gt;. 🥳 Isso significa que há muitos recursos disponíveis para ajudar a aprender e resolver problemas, incluindo uma grande quantidade de bibliotecas de software livre disponíveis através do gerenciador de pacotes npm (Node Package Manager).&lt;/p&gt;

&lt;p&gt;Resumindo, temos como vantagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☁️ Muito leve;&lt;/li&gt;
&lt;li&gt;⚡️ Muito rápido;&lt;/li&gt;
&lt;li&gt;🌟 Usa JavaScript;&lt;/li&gt;
&lt;li&gt;🌎 Tem um dos maiores ecossistemas do mundo;&lt;/li&gt;
&lt;li&gt;👩🏻‍💻 Está sendo utilizado fortemente no mercado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que você já sabe o porquê desta tecnologia estar na boca do povo, vamos dar os primeiros passos? No próximo artigo vou te ensinar a instalar o Node no Ubuntu, Mac e Windows. GO! 🚀&lt;/p&gt;

&lt;p&gt;Ps.: Ah, se você teve interesse em saber sobre qual linguagem é mais rápida em nível de desempenho, recomendo este artigo aqui: &lt;a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/javascript.html" rel="noopener noreferrer"&gt;Benchmarks Game&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>Guia do Node.js, do começo ao fim</title>
      <dc:creator>Vanessa Nascimento</dc:creator>
      <pubDate>Thu, 08 Feb 2024 18:48:32 +0000</pubDate>
      <link>https://forem.com/vanscript/guia-do-nodejs-do-comeco-ao-fim-3cb9</link>
      <guid>https://forem.com/vanscript/guia-do-nodejs-do-comeco-ao-fim-3cb9</guid>
      <description>&lt;p&gt;Olá, sejam muito bem-vindes ao &lt;strong&gt;Guia de formação Node.js, do começo ao fim&lt;/strong&gt;. Meu objetivo aqui é facilitar a sua jornada com &lt;strong&gt;Node.js&lt;/strong&gt;, essa plataforma incrível que talvez ainda seja um pouco misteriosa para você. ✨👩🏻‍💻&lt;/p&gt;

&lt;p&gt;Node.js é uma plataforma de desenvolvimento de software open-source que faz maravilhas permitindo que os desenvolvedores criem aplicações de rede eficientes e escaláveis. Mas vamos deixar a conversa mais técnica para o próximo artigo, onde vamos mergulhar fundo no que é o Node.js. Neste guia, vamos caminhar juntos, desde conceitos básicos até os tópicos mais avançados. Espero que você goste deste roteiro e que ele seja um grande aliado na sua jornada para se tornar uma pessoa desenvolvedora Node.js de mão cheia.&lt;/p&gt;

&lt;p&gt;Vejo você nos próximos artigos! Até daqui a pouco! 😊&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
    </item>
  </channel>
</rss>
