Test Runner

Jest

Jest é o executor de testes clássico do JavaScript: completo, com suporte a snapshots e ainda o padrão em inúmeras bases de código Node.js e React.

intermediate13 min readUpdated 15 de set. de 2026
sum.test.js
js
// sum.test.js
import { sum } from "./sum";

describe("sum", () => {
  test("adds two numbers", () => {
    expect(sum(2, 3)).toBe(5);
  });

  test("handles negatives", () => {
    expect(sum(-1, -1)).toBe(-2);
  });
});
Mantido por
Meta
API
describe, test, expect
Mocks
jest.fn, jest.mock
Snapshots
Integrado
Cobertura
Integrada
Transforms
Babel, ts-jest, SWC

Por que importa

Por que o Jest ainda é importante

Batteries included

Asserções, mocking, snapshots e cobertura já vêm juntos, então um novo projeto precisa de pouquíssima configuração.

Snapshots

Capture a saída uma vez e detecte alterações não intencionais, útil para estruturas serializáveis extensas.

Ecossistema maduro

Anos de plugins, presets e integrações significam que quase qualquer stack possui uma configuração de Jest documentada.

O panorama completo

As três ideias por trás do Jest

Um executor zero-config, uma API de asserção familiar e mocking, snapshots e cobertura integrados.

O executor

Executar

Descobre arquivos de teste, os executa em ambientes isolados e reporta os resultados.

Asserções e mocks

Verificar

expect com matchers, além de jest.fn, jest.spyOn e jest.mock para isolamento.

Pipeline de transformação

Construir

Babel, ts-jest ou SWC compilam a sintaxe moderna e JSX antes da execução dos testes.

Jest num relance

O núcleo do Jest

describe e test

Agrupe suítes e declare casos individuais por comportamento.

Matchers

toBe, toEqual, toMatchObject, toThrow e muitos outros.

Mocks e spies

jest.fn, jest.spyOn e jest.mock isolam a unidade sob teste.

Fake timers

Controle setTimeout e Date para testes de tempo determinísticos.

Snapshots

Armazene um resultado serializado e compare-o em execuções posteriores.

Cobertura

Relatórios de cobertura integrados com definição de thresholds.

Uma breve historia

O executor que definiu uma geração

  1. 2014

    Lançamento do Jest

    O Facebook apresenta um executor de testes projetado para projetos React e JavaScript.

    14
  2. 2016

    Jest 15 e 16

    Uma reescrita reduz a fricção de configuração e os testes de snapshot tornam-se mainstream.

    16
  3. 2018

    Jest 23 e além

    O Jest torna-se o executor de testes JavaScript mais amplamente utilizado.

    18
  4. 2021

    Ascensão do Vite e Vitest

    O Vitest oferece uma alternativa mais rápida e nativa ao Vite com uma API compatível.

    21
  5. Hoje

    Ainda onipresente

    Dominante em bases de código Node.js, React e React Native existentes, e totalmente mantido.

    Hoje

O guia completo

Jest: Tudo que voce precisa saber

O que é o Jest?

O Jest é um test runner de JavaScript criado no Facebook e, atualmente, uma das ferramentas de teste mais utilizadas no ecossistema. Ele é batteries-included: assertions, mocking, snapshot testing e coverage vêm todos em um único pacote, e um novo projeto precisa de pouquíssima configuração para começar.

Durante anos, o Jest foi a escolha padrão para projetos React e Node.js, e continua dominante em bases de código existentes. Mesmo com a ascensão do Vitest, a API do Jest é o vocabulário compartilhado dos testes em JavaScript, o que torna vantajoso conhecê-lo, independentemente de qual runner você utilize no dia a dia.

Escrevendo testes

Um arquivo de teste do Jest usa describe para agrupar e test (ou it) para declarar um caso.

// cart.test.js
import { Cart } from "./cart";

describe("Cart", () => {
  test("starts empty", () => {
    expect(new Cart().items).toEqual([]);
  });

  test("adds an item", () => {
    const cart = new Cart();
    cart.add({ id: 1, price: 10 });
    expect(cart.items).toHaveLength(1);
  });
});

Use beforeEach e afterEach para setup e teardown, e beforeAll e afterAll quando um recurso deve ser criado apenas uma vez para todo o arquivo. Nomeie os testes de acordo com o comportamento, para que uma falha indique exatamente o que quebrou.

Matchers

A API de expect do Jest é ampla e expressiva.

// matchers.test.js
expect(value).toBe(5);                 // strict equality
expect(value).toEqual({ a: 1 });       // deep equality
expect(value).toBeDefined();
expect(list).toContain("a");
expect(fn).toThrow("invalid");
expect(value).toBeGreaterThan(3);
expect(obj).toMatchObject({ id: 1 });  // partial match

O toBe compara com Object.is e é a escolha certa para tipos primitivos. O toEqual compara objetos e arrays recursivamente. O toStrictEqual é mais rigoroso com tipos e propriedades undefined. O toMatchObject é útil quando você se importa apenas com um subconjunto de uma estrutura.

Mocks, spies e mocking de módulos

O mocking do Jest é um de seus recursos mais poderosos.

// users.test.js
import { jest } from "@jest/globals";
import { getUser } from "./users";

jest.mock("./http", () => ({
  get: jest.fn().mockResolvedValue({ id: 1, name: "Ada" }),
}));

test("returns a user", async () => {
  await expect(getUser(1)).resolves.toEqual({ id: 1, name: "Ada" });
});

jest.fn cria uma função mock, jest.spyOn envolve um método real para que você possa observar as chamadas e restaurá-lo posteriormente, e jest.mock substitui um módulo. Como jest.mock sofre hoisting (é içada) acima dos imports, o mock já está configurado antes do carregamento do módulo sob teste.

Sempre resete os mocks entre os testes. Ative clearMocks, resetMocks ou restoreMocks na configuração, ou chame o helper ...AllMocks correspondente em afterEach. O estado de mocks vazados é um dos motivos mais comuns para testes passarem individualmente, mas falharem quando executados juntos.

Testes assíncronos

Use async/await com resolves e rejects, exatamente como você faria no Vitest.

// async.test.js
test("rejects on failure", async () => {
  await expect(loadUser(-1)).rejects.toThrow("Invalid id");
});

O callback done funciona, mas é fácil de usar incorretamente. Prefira usar await. Para timers, jest.useFakeTimers() junto com jest.advanceTimersByTime() torna os testes de debounce e retry determinísticos.

Snapshots

Snapshots serializam um valor e o comparam em execuções futuras.

// config.test.js
test("builds the default config", () => {
  expect(createConfig({ debug: true })).toMatchInlineSnapshot();
});

Inline snapshots ficam no próprio arquivo de teste, o que permite revisá-los em um diff. Snapshots externos são convenientes para saídas grandes, mas frequentemente são atualizados sem inspeção, tornando-se apenas um “carimbo de aprovação”. Use snapshots para dados serializáveis estáveis, e não como um substituto para refletir sobre o que realmente importa.

Configuração

O Jest lê a configuração de jest.config.js, de uma chave jest no package.json ou de uma flag da CLI.

// jest.config.js
export default {
  testEnvironment: "jsdom",
  clearMocks: true,
  collectCoverage: true,
  coverageThreshold: {
    global: { lines: 80, functions: 80 },
  },
  transform: {
    "^.+\\.(t|j)sx?$": ["@swc/jest"],
  },
};

testEnvironment seleciona node ou jsdom. clearMocks evita vazamentos (leakage). Os limites de cobertura (coverage thresholds) transformam uma meta em uma regra obrigatória. O transform decide como TypeScript e JSX são compilados, sendo ts-jest, Babel e SWC as opções mais comuns.

Onde o Jest se encaixa

O Jest é a camada de testes unitários e de integração. Para o comportamento de componentes, combine-o com a Testing Library para testar sob a perspectiva do usuário. Para fluxos completos de usuário, utilize uma ferramenta de end-to-end como Playwright ou Cypress. Se você estiver iniciando um novo projeto Vite, o Vitest oferece a mesma API com um pipeline compartilhado e mais rápido.

Melhores práticas

  • Teste o comportamento através de APIs públicas, não de internals privados.
  • Mantenha apenas uma asserção lógica por teste, sempre que possível.
  • Resete e restaure mocks entre os testes.
  • Prefira async/await em vez de done.
  • Use fake timers para qualquer funcionalidade dependente de tempo.
  • Faça snapshot de estruturas pequenas e estáveis, e revise cada atualização.
  • Execute os testes em CI a cada alteração, não apenas localmente.

Erros comuns

  • Fazer asserções em detalhes de implementação e quebrar testes durante refatorações.
  • Atualizar snapshots cegamente.
  • Esquecer de limpar mocks e vazar estado entre os testes.
  • Usar timers reais, tornando os testes lentos ou instáveis (flaky).
  • Testar tudo no nível unitário e deixar passar bugs de integração.
  • Ignorar a cobertura (coverage) enquanto assume que os testes cobrem os caminhos importantes.

Próximos passos

O Jest é uma base confiável e um vocabulário compartilhado em todo o ecossistema. Compare-o com o Vitest para projetos modernos com Vite, adicione a Testing Library para componentes e cubra as jornadas do usuário com Playwright ou Cypress. Depois, escreva um teste para um bug que você corrigiu recentemente e deixe que ele proteja seu código contra regressões.

Testando código assíncrono

Aguarde a promise e faça a asserção do resultado. O callback done é fácil de esquecer e causa timeouts confusos.

Preferir
test("loads the user", async () => {
  await expect(getUser(1)).resolves.toEqual({
    id: 1,
    name: "Ada",
  });
});
Evitar
test("loads the user", (done) => {
  getUser(1).then((user) => {
    expect(user.name).toBe("Ada");
    done();
  });
});

Escopo de Snapshot

Faça snapshot de estruturas pequenas e estáveis. Um snapshot gigante que todos atualizam cegamente é pior do que não ter teste.

Preferir
expect(parseConfig(input)).toMatchInlineSnapshot(`
  {
    "debug": true,
    "level": "info",
  }
`);
Evitar
expect(renderWholeApp()).toMatchSnapshot();
// huge, unstable and always
// updated without review

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Jest?

Nosso tutorial interativo te guia por Jest passo a passo — com quizzes e codigo real que voce pode executar no navegador.