DEV Community

Cover image for Simplificando Testes com it.each no Jest
Vitor Rios
Vitor Rios

Posted on

Simplificando Testes com it.each no Jest

Escrever testes automatizados é essencial para garantir a qualidade e a estabilidade das aplicações modernas. Muitas vezes, no entanto, acabamos repetindo o mesmo bloco de código com variações mínimas nos dados de entrada. É aí que entra o it.each do Jest — um recurso que permite escrever testes parametrizados de forma clara, enxuta e poderosa.

Neste artigo, vamos explorar como usar it.each na prática, com exemplos que você pode aplicar no seu dia a dia como desenvolvedor(a).


✅ O que é it.each?

it.each (ou test.each) permite executar o mesmo teste com diferentes entradas. Em vez de duplicar vários blocos de it(...), você pode passar uma matriz de valores e o Jest vai rodar o teste para cada conjunto.


🚀 Exemplo básico: verificação de números positivos

it.each([1, 2, 3])('should be greater than zero: %i', (num) => {
  expect(num).toBeGreaterThan(0);
});
Enter fullscreen mode Exit fullscreen mode

Neste exemplo simples, estamos garantindo que todos os números fornecidos são maiores que zero.


🛠 Exemplo real: soma de valores

Imagine que você tem uma função de soma simples e quer garantir que ela funcione corretamente para diferentes entradas:

function sum(a: number, b: number): number {
  return a + b;
}

it.each([
  [1, 2, 3],
  [2, 2, 4],
  [10, -5, 5],
])('should return %i + %i = %i', (a, b, expected) => {
  expect(sum(a, b)).toBe(expected);
});
Enter fullscreen mode Exit fullscreen mode

📦 Exemplo com objetos: validação de entrada

Digamos que você tem uma função que valida se uma string não está vazia:

function isValidString(input: string): boolean {
  return input.trim().length > 0;
}

it.each([
  { input: 'Hello', expected: true },
  { input: ' ', expected: false },
  { input: '', expected: false },
])('should validate string "%s"', ({ input, expected }) => {
  expect(isValidString(input)).toBe(expected);
});
Enter fullscreen mode Exit fullscreen mode

🏷 Exemplo com componente Badge e variações de cor

Imagine que você tem um componente Badge que aceita uma prop color com diferentes valores como "primary", "secondary", "success", etc.

// Badge.tsx
type BadgeProps = {
  color: 'primary' | 'secondary' | 'success' | 'danger';
  children: React.ReactNode;
};

export function Badge({ color, children }: BadgeProps) {
  return <span className={`badge badge-${color}`}>{children}</span>;
}
Enter fullscreen mode Exit fullscreen mode

Agora você quer garantir que o componente renderiza corretamente para todas as cores permitidas:

import { render, screen } from '@testing-library/react';
import { Badge } from './Badge';

it.each([
  'primary',
  'secondary',
  'success',
  'danger',
] as const)('renders Badge with color "%s"', (color) => {
  render(<Badge color={color}>Test</Badge>);
  const badge = screen.getByText('Test');

  expect(badge).toBeInTheDocument();
  expect(badge).toHaveClass(`badge-${color}`);
});
Enter fullscreen mode Exit fullscreen mode

🧠 Dica extra

Se você estiver usando uma lista central de cores no seu design system (como um array exportado), pode até importar essa lista para garantir que os testes sempre acompanhem as novas variações:

// badgeColors.ts
export const badgeColors = ['primary', 'secondary', 'success', 'danger'] as const;
Enter fullscreen mode Exit fullscreen mode
import { badgeColors } from './badgeColors';

it.each(badgeColors)('renders Badge with color "%s"', (color) => {
  render(<Badge color={color}>Test</Badge>);
  expect(screen.getByText('Test')).toHaveClass(`badge-${color}`);
});
Enter fullscreen mode Exit fullscreen mode

✨ Conclusão

O uso de it.each é uma forma poderosa e elegante de reduzir a duplicação e deixar seus testes mais legíveis. Ao parametrizar entradas, você cobre mais casos com menos código — o que é sempre uma vitória!

Se você ainda não usava esse recurso, recomendo começar com testes simples e, aos poucos, aplicar nos fluxos reais da sua aplicação.

Top comments (0)