Pruebas basadas en propiedades en PHP: cómo encontrar bugs que ni sabías que existían
\n\n¿Alguna vez has sentido que tus tests unitarios son como una linterna en una habitación oscura: solo iluminan lo que tú mismo apuntas? Escribes tests para los casos obvios, verificas los valores límite, pero aún así encuentras bugs en producción. ¿Te suena familiar?
\n\nBienvenido al mundo de las pruebas basadas en propiedades en PHP. No es solo otra metodología de moda. Es un cambio de paradigma: en lugar de inventar ejemplos concretos (example-based), describes las propiedades que debe cumplir tu código y dejas que la computadora genere miles de escenarios aleatorios.
\n\nEn este artículo, veremos cómo las pruebas basadas en propiedades en PHP ayudan a encontrar defectos ocultos que los tests clásicos pasan por alto. Verás ejemplos de código reales, conocerás la librería Eris y entenderás por qué este enfoque se está convirtiendo en un estándar en proyectos serios.
¿Qué son las pruebas basadas en propiedades?
\n\nEl término proviene de la programación funcional (gracias a Haskell y la librería QuickCheck), pero la idea es universal. En lugar de escribir:
\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\nFormulas una propiedad: «Para cualquier par de números enteros $a y $b, el resultado de la suma add($a, $b) debe ser igual a $b + $a (conmutatividad)». El framework genera cientos de pares aleatorios y verifica esta propiedad.
La diferencia es enorme: no estás limitado por tu imaginación. La máquina encontrará combinaciones que nunca se te habrían ocurrido. Por ejemplo, ¿qué pasa si le pasas un número muy grande, cero, un valor negativo o null?
Pruebas basadas en propiedades vs. basadas en ejemplos: diferencias clave
\n\n- \n
- Basadas en ejemplos: escribes una entrada concreta y la salida esperada. Rápido y claro, pero solo cubre lo que previste. \n
- Basadas en propiedades: describes invariantes (propiedades) y usas generadores de datos aleatorios. Cubre escenarios desconocidos, pero requiere un pensamiento más abstracto. \n
El enfoque ideal es combinar ambos: basadas en ejemplos para documentar casos típicos, y basadas en propiedades para pruebas de estrés y encontrar errores en los límites.
\n\n¿Por qué las pruebas basadas en propiedades en PHP son imprescindibles?
\n\nPHP es un lenguaje dinámico con tipado débil. Esto significa que tu función puede recibir cualquier cosa: un string en lugar de un número, un objeto en lugar de un array, null donde se espera un int. Las pruebas basadas en propiedades en PHP son excelentes para detectar:
- \n
- Suposiciones implícitas — «pensé que aquí siempre llegaba un número positivo». \n
- Problemas de tipos — la función falla con float aunque espera int. \n
- Valores límite — desbordamiento, arrays vacíos, índices negativos. \n
- Incumplimiento de contratos — la función no mantiene la inmutabilidad o devuelve un tipo inesperado. \n
Esto es especialmente valioso para proyectos educativos y librerías, donde los usuarios pueden pasar cualquier tipo de dato. Si escribes código para otros, las pruebas basadas en propiedades son tu seguro contra errores tontos.
\n\nLibrería Eris: la herramienta para pruebas basadas en propiedades en PHP
\n\nEn el ecosistema PHP hay varias librerías, pero la más madura es Eris (un fork de la Eris original de Giorgio Sironi). Se integra con PHPUnit y ofrece potentes generadores y shrinkers (reducción automática del ejemplo al mínimo que reproduce el error).
\n\nInstalación vía Composer: