Neste post, você aprenderá como os testes funcionam na prática, enquanto constrói um “mini framework de testes” do zero e explora conceitos essenciais de forma simples e direta.

O que é um teste?

Teste é o processo onde verificamos se algo funciona de acordo com o esperado. Por exemplo, no código abaixo utilizo a função sum para somar 2 + 2 e digo que o valor esperado é 4. Se não der erro durante a execução do código significa que o teste passou.

const result = sum(2, 2);
const expected = 4;

if (result !== expected) {
  throw new Error(`${result} is not equal to ${expected}`);
}

Por quê testar?

O objetivo principal dos testes é possibilitar o crescimento sustentável do projeto. Eles fornecem segurança para refatorar, corrigir bugs e adicionar novas funcionalidades sem medo de quebrar o que já funciona.

Importante: o sucesso não está na busca por 100% de cobertura de testes, mas na criação de uma suíte de testes confiável que permita trabalhar com confiança. Ter muitos testes não significa nada se você ainda tiver medo de modificar o código.

Isso já é funcional, mas não escalável. Então, vamos melhorar!

Criando uma biblioteca de asserção

Bibliotecas de asserção ajudam a escrever testes mais legíveis e organizados. Aqui está uma implementação simples:

function expect(result) {
  return {
    toBe(expected) {
      if (result !== expected) {
        throw new Error(`${result} is not equal to ${expected}`);
      }
    },
  };
}

Agora podemos testar assim:

expect(sum(2, 2)).toBe(4);

Construindo um framework de testes

Um framework de testes padroniza a execução e a organização dos testes. Vamos criar uma função simples para organizar os testes e exibir os resultados:

function test(title, callback) {
  try {
    callback();
    console.log(`✔️ PASSED: ${title}`);
  } catch (error) {
    console.error(`❌ FAILED: ${title}`);
    console.error(error.message);
  }
}

Agora, podemos adicionar múltiplos testes:

test("two positive numbers", () => {
  expect(sum(2, 2)).toBe(4);
});

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

test("a positive and a negative number", () => {
  expect(sum(5, -3)).toBe(2);
});

Conclusão

Testes são uma peça-chave para escrever códigos mais confiáveis e sustentáveis. Frameworks populares como Jest e Vitest tornam o processo mais simples, mas compreender como eles funcionam por baixo dos panos é essencial para aproveitar todo o seu potencial. Neste artigo, você deu os primeiros passos para dominar os fundamentos e entender sua aplicação prática.

O que você achou deste post? Tem dúvidas ou experiências para compartilhar? Deixe seu comentário!