Este artículo profundiza en la verdadera naturaleza de las pruebas basadas en propiedades (Property-Based Testing o PBT), más allá de la definición superficial de 'propiedades' y 'generadores'. La idea básica es que PBT combina propiedades (condiciones que deben cumplirse para todas las entradas posibles) con generadores (que crean esas entradas) para encontrar errores. Sin embargo, la complejidad real radica en cómo interactúan estos elementos.
El problema que aborda el artículo es que la definición simple de PBT a menudo no refleja la realidad de su implementación. Una 'propiedad' en PBT se define como una función booleana que debe ser verdadera para todas las entradas posibles. Un ejemplo es verificar si invertir una lista y luego invertirla nuevamente devuelve la lista original. Para hacer esto práctico, se introducen 'precondiciones', que definen qué entradas son válidas. Si una entrada no cumple la precondición, la propiedad no se evalúa.
La clave del artículo es que los generadores no pueden ser completamente independientes de las propiedades. A menudo, es necesario crear 'generadores dependientes' que generen entradas que cumplan las precondiciones. Por ejemplo, al probar una función de inserción y selección en una base de datos, un generador independiente podría crear nombres de tabla aleatorios que no existen en la base de datos, lo que provocaría fallos en la precondición. Un generador dependiente, en cambio, crearía tablas válidas dentro de la base de datos, asegurando que la propiedad se evalúe correctamente.
El artículo ilustra cómo mover partes de la lógica de verificación (la 'propiedad') dentro del generador, lo que permite una mayor integración y flexibilidad. Esto se logra generando datos que cumplen con las precondiciones de forma constructiva, eliminando la necesidad de comprobaciones separadas. Finalmente, el artículo destaca que, aunque esto puede parecer complejo, es una práctica común y que frameworks como QuickCheck ya ofrecen mecanismos (como forAll) para facilitar la escritura de pruebas PBT que combinan generación y verificación de manera fluida. La esencia es que las pruebas basadas en propiedades no son simplemente propiedades y generadores separados, sino una combinación intrínseca de ambos, donde la generación está intrínsecamente ligada a la validación.
