Pular para o conteúdo

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#

dataforge
adopt ../src/main as V        // NÃO: nenhum usuário escreve isto
adopt minha-lib as V          // SIM: é assim que ela será usada

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

tests/cpf_test.df
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()
bash
dataforge test tests/

Teste o contrato, e não a implementação#

Teste istoNão isto
o que uma ação pública devolveo valor de uma variável interna
o tipo do erro levantadoo texto exato da mensagem
que o campo valido existea 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 void um 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 check pega 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#

bash
dataforge test tests/ --cobertura --minimo=80

Uma 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.

Por onde seguir#