Teste baseado em propriedades em PHP: como encontrar bugs que você nem imaginava
\n\nVocê já sentiu que seus testes unitários são como uma lanterna em um quarto escuro: iluminam apenas o que você mesmo direciona? Você escreve testes para os casos óbvios, verifica valores limites, mas ainda encontra bugs em produção. Parece familiar?
\n\nBem-vindo ao mundo do teste baseado em propriedades em PHP. Não é apenas mais uma metodologia da moda. É uma mudança de paradigma: em vez de criar exemplos específicos (example-based), você descreve as propriedades que seu código deve satisfazer e deixa o computador gerar milhares de cenários aleatórios.
\n\nNeste artigo, vamos explorar como o teste baseado em propriedades em PHP ajuda a encontrar defeitos ocultos que os testes clássicos deixam passar. Você verá exemplos reais de código, conhecerá a biblioteca Eris e entenderá por que essa abordagem está se tornando padrão em projetos sérios.
O que é teste baseado em propriedades?
\n\nO termo vem da programação funcional (graças a Haskell e à biblioteca QuickCheck), mas a ideia é universal. Em vez de escrever:
\n\npublic function testAddition(): void\n{\n $this->assertSame(4, add(2, 2));\n $this->assertSame(0, add(-1, 1));\n $this->assertSame(10, add(7, 3));\n}\n\n\nVocê formula uma propriedade: "Para quaisquer números inteiros $a e $b, o resultado da soma add($a, $b) deve ser igual a $b + $a (comutatividade)". O framework gera centenas de pares aleatórios e verifica essa propriedade.
A diferença é colossal: você não fica limitado pela sua imaginação. A máquina encontrará combinações que você jamais pensaria. Por exemplo, o que acontece se você passar um número muito grande, zero, um valor negativo ou null?
Teste baseado em propriedades vs. Teste baseado em exemplos: diferenças principais
\n\n- \n
- Baseado em exemplos: você escreve uma entrada específica e a saída esperada. Rápido, claro, mas cobre apenas o que você previu. \n
- Baseado em propriedades: você descreve invariantes (propriedades) e usa geradores de dados aleatórios. Cobre cenários desconhecidos, mas exige um pensamento mais abstrato. \n
A abordagem ideal é combinar ambos: use exemplos para documentar casos típicos e propriedades para testes de estresse e busca de erros limites.
\n\nPor que o teste baseado em propriedades em PHP é indispensável?
\n\nPHP é uma linguagem dinâmica com tipagem fraca. Isso significa que sua função pode receber qualquer coisa: uma string em vez de um número, um objeto em vez de um array, null onde se espera um int. O teste baseado em propriedades em PHP é excelente para identificar:
- \n
- Suposições implícitas — "Eu achava que aqui sempre vinha um número positivo". \n
- Problemas de tipo — a função quebra com float, embora espere int. \n
- Valores limite — estouro de buffer, arrays vazios, índices negativos. \n
- Quebra de contratos — a função não mantém imutabilidade ou retorna um tipo inesperado. \n
Isso é especialmente valioso para projetos educacionais e bibliotecas, onde os usuários podem passar qualquer tipo de dado. Se você escreve código para outros, os testes baseados em propriedades são seu seguro contra erros bobos.
\n\nBiblioteca Eris: ferramenta para teste baseado em propriedades em PHP
\n\nNo ecossistema PHP, existem várias bibliotecas, mas a mais madura é a Eris (um fork da Eris original de Giorgio Sironi). Ela se integra com PHPUnit e oferece geradores e redutores poderosos (shrinking — redução automática do exemplo ao mínimo que reproduz o erro).
\n\nInstalação via Composer: