Pular para o conteúdo

Testes

Escrever testes que o dataforge test descobre e executa sozinho.

Descoberta automática#

PadrãoExemplo
*_test.dfmatematica_test.df
test_*.dftest_matematica.df
qualquer .df em tests/tests/regras.df

Dentro do arquivo, *toda ação `test_` é um caso**:

tests/matematica_test.df
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"
bash
dataforge test              # tudo
dataforge test tests/ -v    # mostra cada caso
dataforge test --filter=primo
dataforge test --fail-fast

Ganchos#

AçãoRoda
setup_alluma vez, antes de tudo
setupantes de cada caso
teardowndepois de cada caso
teardown_alluma vez, no fim

Anatomia de um bom teste#

Nome que descreve o comportamento#

dataforge
action test_saque_acima_do_saldo():     # bom
action test_sacar_2():                  # ruim

Mensagem em cada assert#

Quando falha, é ela que você lê:

dataforge
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:

dataforge
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#

dataforge
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#

dataforge
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#

text
✓ 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.02s

Regras 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:

dataforge
assert situacao_de(Produto("X", 1, 0)) is Situacao.EmFalta

Se ela também formatasse a saída, testá-la exigiria comparar strings — e mudar o formato quebraria o teste da regra. Separe as camadas.