← Ver a árvore completa

ROTA · 6 CLASSES · 1 GRUPOS

Testes que Valem Salário

Proteja comportamento com subtestes, interfaces, golden files e HTTP em memória.

Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes da árvore são grátis com conta.

O ARCO DA ROTA

01Testes

ORDEM RECOMENDADA

6 classes, do primeiro passo ao fechamento.

Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.

  1. 01
    Testes que Valem SalárioTable-driven tests: casos que contam a história

    Escreva tabelas de casos que aprovam a implementação correta e capturam uma mutação determinística.

  2. 02
    Testes que Valem SalárioSubtests e t.Run: falhas com endereço

    Dê nome e isolamento a cada caso com subtestes, aprovando a implementação correta e capturando a quebrada.

  3. 03
    Testes que Valem SalárioMocks por interface: fakes e spies no tamanho certo

    Controle dependências com interfaces estreitas: fakes para testar estado e spies para verificar interações, sem acoplar o teste à implementação.

  4. 04
    Testes que Valem SalárioGolden files: saídas grandes sob revisão

    Compare saídas grandes e estáveis contra goldens determinísticos: bytes exatos, normalização de JSON, diagnóstico útil e -update como mudança revisada.

  5. 05
    Testes que Valem Saláriohttptest na prática: contratos HTTP sem abrir porta

    Construa requisições e respostas em memória com net/http/httptest, afirme status, header e corpo sem abrir porta, e detecte mutações reais em handlers GET e POST.

  6. 06
    Testes que Valem SalárioCapstone: uma suíte de checkout ponta a ponta

    Reúna table-driven, subtests, fake/spy, golden e httptest em uma suíte de checkout que aprova a versão correta e detecta mutações em duas camadas.

PRÉVIA DA PRIMEIRA CLASSE

Table-driven tests: casos que contam a história

Você escreveu uma função que calcula frete. Testou com um total qualquer, viu o número sair, seguiu para a próxima tarefa. Duas semanas depois alguém muda a comparação de >= para > e o cliente no limite passa a pagar frete indevido. O teste que existia não percebeu nada, porque ele exercitava um total longe da fronteira. O problema não foi a mudança — mudanças vão acontecer. O problema foi o teste não contar a história da regra.

Table-driven tests existem para fazer essa história ficar visível. Em vez de espalhar if got != want em cinco funções quase iguais, você reúne entradas, resultados esperados e o motivo de cada caso em um único slice de structs. O laço percorre a tabela e executa a mesma asserção para cada linha. O que sobra para revisar é a lista de casos: ela precisa responder, sozinha, quais comportamentos o contrato protege.

O risco de uma tabela fraca é o mesmo de uma função sem teste: ela executa, fica verde e dá uma falsa sensação de segurança. Uma tabela só vale quando escolhe entradas capazes de distinguir o contrato correto de uma mutação plausível. Se você só copia variações do mesmo caminho feliz, qualquer defeito pequeno passa batido. Por isso o critério de uma boa linha não é quantidade, é poder de discriminação: qual mudança essa entrada detectaria?

Este mini aplica uma inversão que muda o jogo. Em vez de implementar a função de produção, você implementa o teste. O avaliador recebe sua suíte e a executa contra duas implementações do mesmo contrato: uma conhecida como correta (good) e outra com um defeito deliberado (broken). A aprovação exige duas evidências — nenhuma acusação falsa contra good e ao menos uma acusação verdadeira contra broken. Um teste vazio passa no primeiro critério e falha no segundo; um teste que sempre falha faz o oposto. Sobrará apenas a suíte que realmente discrimina.

A assinatura usa TestingT, uma interface mínima com Helper, Errorf e Run. O corpo continua parecendo um teste Go de verdade: nome começando em Test, tabela de casos, subtestes e mensagens com got e want. A interface existe apenas porque o avaliador concatena seu teste com o harness e roda go run, em vez de orquestrar um subprocesso de go test. Em um repositório normal, você troca TestingT por *testing.T e arquiva a função em um _test.go.

A bancada abaixo resume o mecanismo em quatro passos. O primeiro frame estabelece a tabela. O segundo mostra a implementação boa aprovando cada comparação. O terceiro injeta a mutação e mostra a mesma tabela acusando o caso decisivo. O quarto reúne as duas evidências: passa-na-boa e falha-na-quebrada. Cores não decoram; elas informam o resultado de cada comparação.

A introdução termina aqui

Entre para continuar nos slides, rodar o código e enfrentar os desafios.

Começar pela rota →

ESTA ROTA E TODAS AS OUTRAS

Qualquer plano abre os 188 nós.

Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.

Comparar os 3 planos →Começar pelas classes grátis