Saltar al contenido
Explorar conocimiento

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