Testes
Escrever testes que o dataforge test descobre e executa sozinho.
Descoberta automática#
| Padrão | Exemplo |
|---|---|
*_test.df | matematica_test.df |
test_*.df | test_matematica.df |
qualquer .df em tests/ | tests/regras.df |
Dentro do arquivo, *toda ação `test_` é um caso**:
action test_fatorial_casos_base():
assert fatorial(0) is 1, "fatorial de 0"
assert fatorial(1) is 1, "fatorial de 1"
action test_fatorial_cresce():
assert fatorial(5) is 120, "fatorial de 5"dataforge test # tudo
dataforge test tests/ -v # mostra cada caso
dataforge test --filter=primo
dataforge test --fail-fastGanchos#
| Ação | Roda |
|---|---|
setup_all | uma vez, antes de tudo |
setup | antes de cada caso |
teardown | depois de cada caso |
teardown_all | uma vez, no fim |
Anatomia de um bom teste#
Nome que descreve o comportamento#
action test_saque_acima_do_saldo(): # bom
action test_sacar_2(): # ruimMensagem em cada assert#
Quando falha, é ela que você lê:
assert depois.saldo is 700, "saldo apos saque"Um comportamento por caso#
Se um test_tudo falha, você não sabe qual das oito verificações quebrou.
Testar erros#
O erro esperado é parte do contrato, e merece teste:
action test_saque_acima_do_saldo():
erro := ""
monitor:
sacar(Conta("Ana", 100), 500)
handle e:
erro := e.message
assert erro is "saldo insuficiente", "mensagem do guard"Note que o assert verifica a mensagem, não só que algo falhou. Isso pega o caso em que a ação falha pelo motivo errado.
Testar imutabilidade#
action test_saque_nao_muda_o_original():
c := Conta("Ana", 1000)
depois := sacar(c, 300)
assert depois.saldo is 700, "saldo apos saque"
assert c.saldo is 1000, "o original nao muda"O segundo assert é o que garante ausência de efeito colateral. Sem ele, uma implementação que mutasse o original passaria.
Cobrir faixas#
action test_primos_conhecidos():
cycle n in [2, 3, 5, 7, 11, 13]:
assert eh_primo(n) is yes, $"{n} e primo"A mensagem interpolada diz qual valor falhou.
A saída#
✓ tests/matematica_test.df (3/3)
ok test_fatorial_casos_base 0.1ms
ok test_fatorial_cresce 0.1ms
✗ tests/texto_test.df (1/2)
FALHOU test_juncao
join
em tests/texto_test.df:12
via test_juncao (linha 10)
4 passaram, 1 falharam em 2 arquivo(s) — 0.02sRegras puras são testáveis#
Uma ação que não imprime, não lê arquivo e não consulta banco tem teste de uma linha:
assert situacao_de(Produto("X", 1, 0)) is Situacao.EmFaltaSe ela também formatasse a saída, testá-la exigiria comparar strings — e mudar o formato quebraria o teste da regra. Separe as camadas.