Testes de biblioteca
Testar pelo nome público, e por que o caminho relativo esconde exatamente o bug que importa.
O teste de uma biblioteca tem um trabalho a mais que o de um programa: ele é o primeiro usuário. Se ele chega ao código por um caminho que nenhum usuário usaria, ele deixa de testar a única coisa que só ele pode testar — a fronteira.
Importe pelo nome, não pelo caminho#
adopt ../src/main as V // NÃO: nenhum usuário escreve isto
adopt minha-lib as V // SIM: é assim que ela será usadaA segunda forma exercita a resolução de verdade: o entry do manifesto, o relay, o nome do pacote. A primeira pula tudo isso e testa arquivos soltos.
A forma de um teste#
adopt Arcane.Crucible as C
action cpf(texto):
yield len(texto) is 11
crucible "cpf":
trial "aceita um CPF com 11 digitos":
expect cpf("52998224725") is yes
trial "recusa o numero de digitos errado":
expect cpf("123") is no
C.run()dataforge test tests/Teste o contrato, e não a implementação#
| Teste isto | Não isto |
|---|---|
| o que uma ação pública devolve | o valor de uma variável interna |
| o tipo do erro levantado | o texto exato da mensagem |
que o campo valido existe | a ordem dos campos do record |
| o comportamento na borda (vazio, zero, negativo) | o caminho que o código toma por dentro |
A regra prática: um teste que quebra quando você melhora a implementação sem mudar o comportamento é um teste que está no lugar errado.
As bordas que uma biblioteca precisa cobrir#
- Vazio — texto vazio, cluster
[], vault{}. É o que mais chega de formulário. - Void — quem usa vai passar
voidum dia, e a mensagem precisa dizer o que fazer. - O tipo errado — um número onde se espera texto. Com anotação de tipo, o
checkpega antes; sem ela, o teste é a única defesa. - O limite — o maior valor aceito, e o primeiro recusado.
- A repetição — chamar duas vezes devolve o mesmo? Se não, há estado escondido.
Cobertura, e o número que mente#
dataforge test tests/ --cobertura --minimo=80Uma ação nunca chamada aparece com 0%, e não com 20% — a linha da declaração não conta, o corpo conta. E um arquivo que nenhum teste toca aparece no relatório com 0% em vez de sumir dele: sumir é o que faz uma cobertura de 95% conviver com metade do sistema sem teste.
forge_modules/ fica de fora da descoberta. Sem isso, um projeto com 13 testes relatava 89, e a suíte ficava vermelha por falha de uma biblioteca que ninguém escreveu.
Instantâneo, para saída grande#
Quando o que se testa é um texto longo — um relatório, um HTML, um CSV —, comparar à mão é inviável. O instantâneo grava na primeira vez e compara nas seguintes; DF_ATUALIZAR_SNAPSHOT=1 aceita a mudança.
Atualizar por padrão seria pior que não ter instantâneo: o teste passaria a concordar com qualquer mudança, inclusive a errada.