Felipe Cesar

    Comece do Zero: Entenda como testes funcionam com JavaScript

    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!