Pare de Executar Toda a Sua Suite de Testes em Cada Commit 🚫🧪

Published: (February 10, 2026 at 02:18 PM EST)
6 min read
Source: Dev.to

Source: Dev.to

Cover image for Pare de Executar Toda a Sua Suite de Testes em Cada Commit 🚫🧪

Alan Schio

O Problema

Executar toda a sua suite de testes antes de cada commit é:

  • Lento – desperdiça tempo precioso de desenvolvimento
  • 😤 Frustrante – quebra seu estado de fluxo
  • 🔄 Redundante – testa código que você nem tocou

A maioria dos desenvolvedores:

  • Pula os testes completamente (perigoso!)
  • Espera por longas execuções de testes (frustrante!)
  • Faz push e torce para o CI pegar os problemas (arriscado!)

Tem que haver uma maneira melhor.

A Solução: test‑staged

test-staged é como o lint-staged, mas para testes. Ele identifica inteligentemente quais testes estão relacionados às suas mudanças em stage e executa apenas esses.

Quão Inteligente É?

test-staged usa diferentes estratégias dependendo do seu test runner:

RunnerEstratégia
Jest / VitestUsa análise nativa de grafo de dependências (--findRelatedTests / vitest related)
Mocha / AvaMapeia arquivos fonte para arquivos de teste (ex.: user.ts → user.test.ts, src/api/users.ts → src/api/__tests__/users.test.ts)

Começando em 30 segundos

A instalação é moleza:

npm install -D test-staged
# ou
pnpm add -D test-staged
# ou
yarn add -D test-staged
# ou
bun add -D test-staged

Sério. Zero configuração por padrão.

Configure como um Hook de Pre‑Commit

A mágica acontece quando você combina com o Husky:

# Instale o husky
npm install -D husky
npx husky init

# Adicione test-staged ao pre‑commit
echo "npx test-staged" > .husky/pre-commit

Agora, a cada commit, o hook:

  • ✅ Executa apenas os testes relacionados às mudanças
  • ⚡ Completa em segundos ao invés de minutos
  • 🛡️ Bloqueia o commit se os testes falharem

Exemplos do Mundo Real

Exemplo 1 – Mudança em um Único Arquivo

Você está trabalhando em uma funcionalidade de autenticação de usuário:

# Você modificou:
git add src/auth/login.ts

test-staged executa APENAS:

src/auth/__tests__/login.test.ts
src/integration/__tests__/auth-flow.test.ts   # (porque importa login.ts)

E NÃO executa:

src/payments/__tests__/*.test.ts   ❌
src/dashboard/__tests__/*.test.ts  ❌
# (mais de 200 testes não relacionados) ❌

Resultado: testes completam em ~3 s ao invés de ~2 min.

Exemplo 2 – Refatorando Utilitários

Você refatorou uma função utilitária:

# Você modificou:
git add src/utils/formatDate.ts

test-staged encontra TODOS os testes que dependem dela:

src/utils/__tests__/formatDate.test.ts
src/components/__tests__/DatePicker.test.ts
src/pages/__tests__/Dashboard.test.ts

Inteligente o suficiente para capturar dependências indiretas, rápido o suficiente para manter a produtividade.

Exemplo 3 – Suporte a Monorepo

Trabalhando em um monorepo? test-staged te cobre:

# Você está em packages/ui
git add Button.tsx

Executa apenas:

packages/ui/__tests__/Button.test.tsx

E não executa testes de:

packages/api/   ❌
packages/cli/    ❌

Por Que Você Vai Amar

🎯 Zero Configuração

Detecta automaticamente:

  • Seu gerenciador de pacotes (npm, pnpm, yarn, bun)
  • Seu test runner (Jest, Vitest, Mocha, Ava)
  • Sua estrutura de projeto (monorepo ou pacote único)

⚡ Extremamente Rápido

Em um projeto típico com 500+ testes:

AntesDepois
2‑3 min por commit2‑5 s por commit

Melhoria de ~36× no uso real.

🧠 Realmente Inteligente

Jest / Vitest – usa o grafo de dependências nativo:

// Se você mudar userService.ts
// ele encontra testes que o importam:
import { createUser } from './userService';
import { validateUser } from './userService';

Mocha / Ava – usa correspondência de padrões:

src/models/user.ts      → src/models/user.test.ts
src/api/users.ts        → src/api/__tests__/users.test.ts
lib/parser.ts           → lib/parser.spec.ts

🛠️ Personalizável Quando Necessário

Embora funcione sem configuração, você pode customizá‑lo:

Via package.json

{
  "test-staged": {
    "runner": "jest",
    "mode": "related",
    "testExtensions": [".test", ".spec", ".e2e"]
  }
}

Via .test-stagedrc.json

{
  "runner": "vitest",
  "testExtensions": [".test", ".spec", "Test", "E2E"]
}

Test Runners Suportados

RunnerMétodo de Detecção
VitestNativo vitest related (grafo de dependências)
Jest--findRelatedTests
MochaMapeamento de padrões de arquivos
AvaMapeamento de padrões de arquivos

⭐ Nativo --findRelatedTests (grafo de dependências)
Mocha ✅ Correspondência de padrões de arquivo
Ava ✅ Correspondência de padrões de arquivo

Mais runners em breve!

A Experiência do Desenvolvedor

Veja como fica seu fluxo de trabalho:

# Faça suas mudanças
vim src/components/Button.tsx

# Coloque em stage
git add src/components/Button.tsx

# Commit (test‑staged executa automaticamente via hook de pre‑commit)
git commit -m "fix: estado hover do botão"

# Saída:
Running tests for staged files...
 src/components/__tests__/Button.test.tsx (2 tests) 0.8s

Tests passed!
[main abc1234] fix: estado hover do botão

Sem comandos de teste manuais. Sem espera. Sem commits quebrados.

Perguntas Comuns

P: E se eu quiser executar todos os testes?
R: Apenas pule o hook: git commit --no-verify ou execute sua suite de testes manualmente.

P: Funciona com CI?
R: Sim! Seu CI ainda deve executar a suite de testes completa. test‑staged é para velocidade no desenvolvimento local.

P: E quanto a testes de integração/E2E?
R: test‑staged vai encontrá‑los se eles importarem seus arquivos modificados. Você também pode customizar quais testes executar.

P: Posso usar sem hooks do Git?
R: Absolutamente! Basta executar npx test-staged manualmente quando quiser.

Experimente Hoje

Comece em menos de um minuto:

npm install -D test-staged husky
npx husky init
echo "npx test-staged" > .husky/pre-commit

Depois faça um commit e veja a mágica acontecer. ✨

Resumindo

Se você ainda está executando toda a suite de testes em cada commit, está desperdiçando tempo. test-staged te dá:

  • Commits mais rápidos – segundos ao invés de minutos
  • 🎯 Melhor foco – teste apenas o que mudou
  • 🛡️ Código mais seguro – testes realmente executam ao invés de serem pulados
  • 🚀 Melhor DX – zero configuração, simplesmente funciona

Experimente e me diga o que você achou! Seu eu do futuro vai te agradecer. 🙌

Você já experimentou test-staged? Qual é sua estratégia atual de testes em pre‑commit? Compartilhe nos comentários abaixo! 👇

0 views
Back to Blog

Related posts

Read more »

Playwright Codegen

Playwright & Codegen – Como gravar testes de integração em .NET Playwright é uma das bibliotecas de teste end‑to‑end mais completas do mercado: suporta os prin...