Pular para o conteúdo

Testes unitários

O que é uma unidade, a forma preparar-agir-conferir, e um teste por razão de falhar.

Uma unidade é o menor pedaço de comportamento que faz sentido sozinho — quase sempre uma ação ou um método. O teste unitário a exercita sem o que é lento, caro ou de fora: sem rede, sem disco, sem relógio de verdade.

Preparar, agir, conferir#

dataforge
adopt Arcane.Crucible

action desconto(total, cliente):
    given cliente["vip"]:
        yield total * 0.1
    given total bigger_eq 200:
        yield total * 0.05
    yield 0

crucible "desconto":
    trial "vip ganha 10% em qualquer valor":
        // preparar
        cliente := {"vip": yes}
        // agir
        d := desconto(50, cliente)
        // conferir
        expect d is 5.0

    trial "comum ganha 5% a partir de 200":
        expect desconto(200, {"vip": no}) is 10.0

    trial "comum abaixo de 200 nao ganha nada":
        expect desconto(199.99, {"vip": no}) is 0

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

As cinco regras#

RegraSem ela
uma razão para falhar por testeo teste cai e não se sabe qual das quatro coisas quebrou
o nome diz o comportamentoteste_desconto_3 falha, e é preciso ler o corpo para saber o quê
sem lógica no teste (sem given, sem laço)o teste passa a precisar de teste
independente da ordemo teste 7 só passa depois do 6, e rodar sozinho falha
rápido (milissegundos)ninguém roda a suíte antes do commit, e ela para de proteger

Os limites valem mais que o meio#

O bug mora na fronteira: 199.99 e 200 dizem mais sobre desconto que 150 e 500. Para cada bigger_eq, teste o valor exato e o imediatamente abaixo.

Continue em Parametrizados e Dublês.