práctica · intermedio · 2 min de lectura
Property-Based Testing
El property-based testing genera inputs aleatorios y verifica que ciertas propiedades o invariantes se cumplan para todos ellos, encontrando casos borde que el desarrollador no anticipó.
No requiere conocimientos previos.
Alcance en breve
Cubre
- Property-Based Testing as a concept
No cubre
- implementation details
Supone
- The reader understands relevant fundamentals.
Resumen
En el testing tradicional, escribís inputs específicos y outputs esperados: sum(2, 3) == 5. En property-based testing, definís propiedades: "la suma es conmutativa", "ordenar dos veces da el mismo resultado que ordenar una vez". El framework genera cientos de inputs aleatorios y verifica que la propiedad se cumpla para todos.
Si encuentra un contraejemplo, lo reduce al mínimo —shrinking—: "la propiedad falla con [0, -1, 5]" → shrinking → "falla con [0, -1]". Así encontrás bugs con inputs que nunca habrías escrito manualmente.
Alcance y supuestos
Cubre property-based testing, su diferencia con example-based y herramientas. Asume familiaridad con testing.
Modelo mental
Un ingeniero que prueba un puente. En vez de probar con 3 pesos específicos, define "el puente debe soportar cualquier carga distribuida de hasta 10 toneladas" y una máquina aplica cargas aleatorias.
Uso práctico
- ✅ Algoritmos, serialización, parsers, transformaciones de datos.
- ❌ Tests donde el output esperado depende de lógica de negocio compleja sin propiedades obvias.
Ejemplo trabajado: propiedad de ordenamiento
test('ordenar es idempotente', () => {
fc.assert(fc.property(fc.array(fc.integer()), (arr) => {
const sorted = sort(arr);
expect(sort(sorted)).toEqual(sorted);
}));
});
fast-check genera cientos de arrays aleatorios incluyendo vacios, negativos y duplicados.
Evidencia
- QuickCheck (Haskell) fue el pionero. Hypothesis (Python) y fast-check (JS/TS) son las implementaciones modernas.
Fuentes citadas
- Wikipedia, Unit testing (Síntesis, 21-07-2026)