O Que É Teste Baseado em Propriedades?
O teste baseado em propriedades afirma que uma propriedade geral se mantém em muitas entradas geradas automaticamente, em vez de verificar alguns casos escolhidos manualmente.
A maioria dos testes usa exemplos que você escolheu manualmente. O teste baseado em propriedades, em vez disso, declara uma regra que deve ser sempre verdadeira e então deixa o framework gerar centenas de entradas aleatórias para tentar quebrá-la. Quando encontra uma entrada que falha, ele a reduz ao menor exemplo, frequentemente revelando casos extremos que você nunca teria escrito manualmente.
Propriedades em vez de exemplos
Em vez de afirmar que reverse([1,2,3]) é igual a [3,2,1], você afirma uma propriedade: inverter uma lista duas vezes produz a lista original. O framework então lança muitas listas aleatórias contra essa propriedade, explorando muito mais do espaço de entrada do que os testes por exemplo fazem.
Geração e shrinking
O framework gera entradas a partir de uma descrição dos dados, roda a propriedade e, em caso de falha, reduz a entrada ao caso mínimo que ainda falha. O shrinking é o que torna a técnica prática: em vez de uma falha aleatória gigante, você obtém um contraexemplo minúsculo e depurável.
Um exemplo rápido
Uma propriedade de ida e volta verifica se codificar e depois decodificar qualquer string retorna a original, em muitas strings geradas.
forAll(strings, (s) => {
expect(decode(encode(s))).toBe(s);
});No que ele é bom
- Encontrar casos de fronteira e extremos que os humanos ignoram.
- Testar serialização, parsing e ida e volta.
- Verificar propriedades matemáticas ou do tipo invariante.
- Complementar testes baseados em exemplos, não substituí-los.
Teste baseado em propriedades no CI
Como executa cada propriedade sobre muitas entradas, o teste baseado em propriedades é mais pesado que um único teste por exemplo, e uma entrada gerada pode ocasionalmente expor não-determinismo genuíno. Fixar a seed aleatória mantém as execuções reproduzíveis, e rodar essas suítes em runners rápidos absorve o volume extra de entradas.
Principais conclusões
- O teste baseado em propriedades verifica invariantes sobre muitas entradas geradas.
- O shrinking reduz uma falha a um exemplo mínimo e depurável.
- Ele se destaca em casos extremos e propriedades de ida e volta; fixe as seeds no CI.