Pare de Executar Toda a Sua Suite de Testes em Cada Commit 🚫🧪
Source: Dev.to

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:
| Runner | Estratégia |
|---|---|
| Jest / Vitest | Usa análise nativa de grafo de dependências (--findRelatedTests / vitest related) |
| Mocha / Ava | Mapeia 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:
| Antes | Depois |
|---|---|
| 2‑3 min por commit | 2‑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
| Runner | Método de Detecção |
|---|---|
| Vitest ⭐ | Nativo vitest related (grafo de dependências) |
| Jest | --findRelatedTests |
| Mocha | Mapeamento de padrões de arquivos |
| Ava | Mapeamento 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. ✨
Links
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! 👇
