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 3As cinco regras#
| Regra | Sem ela |
|---|---|
| uma razão para falhar por teste | o teste cai e não se sabe qual das quatro coisas quebrou |
| o nome diz o comportamento | teste_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 ordem | o 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.