Pular para o conteúdo

Testes de regressão

O teste que falha antes do conserto, o instantâneo — e por que todo bug vira teste.

Um bug corrigido sem teste volta. Não por descuido: a correção é feita na pressa, e três meses depois alguém “simplifica” aquela linha estranha. O teste de regressão é o que explica, para sempre, por que a linha é estranha.

A ordem é o método#

  1. Reproduza o bug num teste. Ele precisa falhar — pelo motivo do bug.
  2. Corrija o código. O teste passa.
  3. Deixe o teste com o nome do comportamento, e o número do chamado num comentário.
dataforge
adopt Arcane.Crucible

// Chamado #318: "Joao da Silva" virava "Joao Da Silva" na nota fiscal.
action titulo_de_nome(nome):
    miudas := ["da", "de", "do", "das", "dos", "e"]
    partes := []
    cycle p in nome.lower().split(" "):
        given p in miudas and len(partes) bigger 0:
            partes.append(p)
        otherwise:
            partes.append(capitalize(p))
    yield " ".join(partes)

crucible "nome na nota fiscal":
    // #318 — a preposicao ficava maiuscula
    trial "preposicao no meio fica minuscula":
        expect titulo_de_nome("JOAO DA SILVA") is "Joao da Silva"

    trial "mas no comeco e maiuscula":
        expect titulo_de_nome("de souza") is "De Souza"

r := Crucible.run()
assert r["falhou"] is 0

O instantâneo, para o que é grande#

Para uma saída de trinta linhas — um relatório, um HTML, um JSON — escrever o esperado à mão dá um teste que ninguém mantém. Crucible.snapshot grava na primeira vez e compara depois; DF_ATUALIZAR_SNAPSHOT=1 aceita uma mudança intencional.

Instantâneo serve paraNão serve para
uma saída grande e estávelum valor com data, hora ou id aleatório
pegar a mudança não pedidadescobrir se a saída está certa — na primeira vez ele aprova qualquer coisa
HTML, relatório, JSON de rotao que cabe num expect … is …

Continue em Instantâneos e Mutação.