JavaScript

Testes em JavaScript: Jest, Vitest e Testing Library na Prática na Prática

8 min de leitura

Testes em JavaScript: Jest, Vitest e Testing Library na Prática na Prática

Introdução aos Frameworks de Teste em JavaScript Testes automatizados são a base de software confiável e manutenível. Em JavaScript, você tem três ferramentas principais: Jest (robusto e completo), Vitest (moderno e rápido), e Testing Library (focado em comportamento do usuário). Cada uma resolve problemas específicos, e dominá-las é essencial para qualquer desenvolvedor profissional. A escolha entre elas depende do seu contexto. Jest é ideal para projetos estabelecidos; Vitest excele em aplicações Vite modernas; Testing Library complementa ambos quando você precisa testar interfaces de usuário. Neste artigo, você aprenderá configuração, padrões práticos e como usá-las em conjunto. Jest: A Base Sólida Configuração e Setup Jest é o framework de testes mais usado em JavaScript. Sua configuração é mínima graças aos padrões inteligentes. Instale com e crie um arquivo : Escrevendo Testes Básicos Vamos testar uma função simples de cálculo. Crie : Agora : Execute com . Jest fornece assertions claras ( , , ), setup/teardown com e , e relatórios de

<h2>Introdução aos Frameworks de Teste em JavaScript</h2>

<p>Testes automatizados são a base de software confiável e manutenível. Em JavaScript, você tem três ferramentas principais: Jest (robusto e completo), Vitest (moderno e rápido), e Testing Library (focado em comportamento do usuário). Cada uma resolve problemas específicos, e dominá-las é essencial para qualquer desenvolvedor profissional.</p>

<p>A escolha entre elas depende do seu contexto. Jest é ideal para projetos estabelecidos; Vitest excele em aplicações Vite modernas; Testing Library complementa ambos quando você precisa testar interfaces de usuário. Neste artigo, você aprenderá configuração, padrões práticos e como usá-las em conjunto.</p>

<h2>Jest: A Base Sólida</h2>

<h3>Configuração e Setup</h3>

<p>Jest é o framework de testes mais usado em JavaScript. Sua configuração é mínima graças aos padrões inteligentes. Instale com <code>npm install --save-dev jest</code> e crie um arquivo <code>jest.config.js</code>:</p>

<pre><code class="language-javascript">module.exports = {

testEnvironment: &#039;node&#039;,

collectCoverageFrom: [&#039;src/*/.js&#039;],

coveragePathIgnorePatterns: [&#039;/node_modules/&#039;],

testMatch: [&#039;/__tests__//*.test.js&#039;]

};</code></pre>

<h3>Escrevendo Testes Básicos</h3>

<p>Vamos testar uma função simples de cálculo. Crie <code>src/calculator.js</code>:</p>

<pre><code class="language-javascript">function soma(a, b) {

return a + b;

}

function multiplicacao(a, b) {

return a * b;

}

module.exports = { soma, multiplicacao };</code></pre>

<p>Agora <code>src/__tests__/calculator.test.js</code>:</p>

<pre><code class="language-javascript">const { soma, multiplicacao } = require(&#039;../calculator&#039;);

describe(&#039;Calculator&#039;, () =&gt; {

it(&#039;deve somar dois números corretamente&#039;, () =&gt; {

expect(soma(2, 3)).toBe(5);

});

it(&#039;deve multiplicar dois números corretamente&#039;, () =&gt; {

expect(multiplicacao(4, 5)).toBe(20);

});

it(&#039;deve retornar 0 para soma com valores negativos&#039;, () =&gt; {

expect(soma(-5, 5)).toBe(0);

});

});</code></pre>

<p>Execute com <code>npm test</code>. Jest fornece assertions claras (<code>toBe</code>, <code>toEqual</code>, <code>toMatch</code>), setup/teardown com <code>beforeEach</code> e <code>afterEach</code>, e relatórios de cobertura automaticamente. Para testes mais avançados, use mocks: <code>jest.fn()</code> para funções e <code>jest.mock()</code> para módulos inteiros.</p>

<h2>Vitest: Performance e Modernidade</h2>

<h3>Por Que Vitest?</h3>

<p>Vitest é construído sobre Vite e oferece reload instantâneo (HMR) e execução paralela nativa. É perfeito se você já usa Vite. A API é compatível com Jest, facilitando a migração.</p>

<h3>Primeiros Passos</h3>

<p>Instale: <code>npm install --save-dev vitest</code>. Crie <code>vitest.config.js</code>:</p>

<pre><code class="language-javascript">import { defineConfig } from &#039;vitest/config&#039;;

export default defineConfig({

test: {

environment: &#039;node&#039;,

coverage: {

provider: &#039;v8&#039;

}

}

});</code></pre>

<p>Teste o mesmo calculator com Vitest em <code>src/__tests__/calculator.vitest.js</code>:</p>

<pre><code class="language-javascript">import { describe, it, expect } from &#039;vitest&#039;;

import { soma, multiplicacao } from &#039;../calculator&#039;;

describe(&#039;Calculator com Vitest&#039;, () =&gt; {

it(&#039;soma dois números&#039;, () =&gt; {

expect(soma(10, 20)).toBe(30);

});

it(&#039;trata erros de entrada&#039;, () =&gt; {

expect(() =&gt; soma(null, 5)).toBeDefined();

});

});</code></pre>

<p>Execute com <code>npm run test -- vitest</code>. A diferença prática: Vitest reconstrói testes modificados em milissegundos, não segundos. Para projetos grandes, isso muda a experiência de desenvolvimento significativamente.</p>

<h2>Testing Library: Testando Como Usuários</h2>

<h3>Filosofia de Teste</h3>

<p>Testing Library não testa implementação, testa comportamento. Você evita selecionar por <code>className</code> ou <code>data-testid</code> desnecessários, focando em como usuários realmente interagem: clicam em botões, preenchem campos, leem texto.</p>

<h3>Testando Componentes React</h3>

<p>Instale: <code>npm install --save-dev @testing-library/react @testing-library/jest-dom</code>. Crie um componente simples <code>src/components/LoginForm.jsx</code>:</p>

<pre><code class="language-javascript">import { useState } from &#039;react&#039;;

export function LoginForm({ onSubmit }) {

const [email, setEmail] = useState(&#039;&#039;);

return (

&lt;form onSubmit={(e) =&gt; {

e.preventDefault();

onSubmit(email);

}}&gt;

&lt;label htmlFor=&quot;email&quot;&gt;Email&lt;/label&gt;

&lt;input

id=&quot;email&quot;

type=&quot;email&quot;

value={email}

onChange={(e) =&gt; setEmail(e.target.value)}

/&gt;

&lt;button type=&quot;submit&quot;&gt;Entrar&lt;/button&gt;

&lt;/form&gt;

);

}</code></pre>

<p>Teste com <code>src/__tests__/LoginForm.test.jsx</code>:</p>

<pre><code class="language-javascript">import { render, screen, fireEvent } from &#039;@testing-library/react&#039;;

import { LoginForm } from &#039;../components/LoginForm&#039;;

describe(&#039;LoginForm&#039;, () =&gt; {

it(&#039;chama onSubmit quando formulário é enviado&#039;, () =&gt; {

const handleSubmit = jest.fn();

render(&lt;LoginForm onSubmit={handleSubmit} /&gt;);

const input = screen.getByLabelText(&#039;Email&#039;);

const button = screen.getByRole(&#039;button&#039;, { name: /entrar/i });

fireEvent.change(input, { target: { value: &#039;test@example.com&#039; } });

fireEvent.click(button);

expect(handleSubmit).toHaveBeenCalledWith(&#039;test@example.com&#039;);

});

it(&#039;exibe label corretamente&#039;, () =&gt; {

render(&lt;LoginForm onSubmit={() =&gt; {}} /&gt;);

expect(screen.getByLabelText(&#039;Email&#039;)).toBeInTheDocument();

});

});</code></pre>

<p>Use <code>getByRole</code> e <code>getByLabelText</code> (acessíveis a usuários) em vez de <code>getByTestId</code>. Isso garante que sua aplicação é usável por todos e força boas práticas de acessibilidade.</p>

<h2>Integrando as Três Ferramentas</h2>

<p>Na prática profissional, você usa todas juntas. Jest para lógica de negócio pura, Vitest para performance em desenvolvimento, Testing Library para UI. Um padrão comum:</p>

<pre><code class="language-javascript">// src/__tests__/integration.test.js

import { render, screen, waitFor } from &#039;@testing-library/react&#039;;

import userEvent from &#039;@testing-library/user-event&#039;;

import { App } from &#039;../App&#039;;

describe(&#039;Fluxo completo de usuário&#039;, () =&gt; {

it(&#039;usuário faz login e acessa dashboard&#039;, async () =&gt; {

render(&lt;App /&gt;);

const user = userEvent.setup();

const emailInput = screen.getByLabelText(&#039;Email&#039;);

await user.type(emailInput, &#039;user@test.com&#039;);

await user.click(screen.getByRole(&#039;button&#039;, { name: /entrar/i }));

await waitFor(() =&gt; {

expect(screen.getByText(/bem-vindo/i)).toBeInTheDocument();

});

});

});</code></pre>

<p>Use <code>userEvent</code> (simulação mais realista que <code>fireEvent</code>) e <code>waitFor</code> para operações assíncronas. Adicione coverage: <code>jest --coverage</code> gera relatórios HTML detalhados.</p>

<h2>Conclusão</h2>

<p>Dominar testes em JavaScript exige entender quando usar cada ferramenta. <strong>Primeiro aprendizado:</strong> Jest fornece a base sólida com API simples e integração perfeita com qualquer projeto. <strong>Segundo:</strong> Vitest moderniza a experiência com HMR e performance, ideal para workflows de desenvolvimento intensivo. <strong>Terceiro:</strong> Testing Library muda seu mindset, forçando código mais acessível e testável focando em comportamento, não implementação. A combinação desses conhecimentos transforma você de quem escreve testes em quem escreve código testável desde o início.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://jestjs.io/docs/getting-started" target="_blank" rel="noopener noreferrer">Jest Documentation</a></li>

<li><a href="https://vitest.dev/guide/" target="_blank" rel="noopener noreferrer">Vitest Guide</a></li>

<li><a href="https://testing-library.com/docs/queries/about" target="_blank" rel="noopener noreferrer">Testing Library Best Practices</a></li>

<li><a href="https://kentcdodds.com/blog/common-mistakes-with-react-testing-library" target="_blank" rel="noopener noreferrer">React Testing Patterns</a></li>

<li><a href="https://www.pearson.com/en-us/subject-catalog/p/test-driven-development-by-example/P200000009675" target="_blank" rel="noopener noreferrer">Test Driven Development by Example - Kent Beck</a></li>

</ul>

Comentários

Mais em JavaScript

Dominando Currying e Partial Application em JavaScript em Projetos Reais
Dominando Currying e Partial Application em JavaScript em Projetos Reais

Currying: A Arte de Transformar Funções Currying é uma técnica que transforma...

Como Usar Objetos em JavaScript: Criação, Propriedades e Métodos em Produção
Como Usar Objetos em JavaScript: Criação, Propriedades e Métodos em Produção

Fundamentos de Objetos em JavaScript Um objeto em JavaScript é uma estrutura...

Desestruturação, Spread e Rest em Objetos JavaScript: Do Básico ao Avançado
Desestruturação, Spread e Rest em Objetos JavaScript: Do Básico ao Avançado

Desestruturação em Objetos JavaScript A desestruturação é uma sintaxe moderna...