Introducción
Las pruebas tradicionales verifican que una función funciona con valores específicos. Pero, ¿qué pasa si no sabes de antemano qué datos de entrada causarán un error? Hypothesis – pruebas generativas resuelve este problema de forma automática.
Hypothesis es una potente librería de property-based testing para Python que transforma por completo tu enfoque de las pruebas. En lugar de crear datos de prueba manualmente, genera automáticamente miles de valores de entrada diferentes, buscando casos extremos, errores o situaciones inesperadas. En vez de escribir múltiples tests con valores concretos, describes las propiedades e invariantes de tu función, y Hypothesis intenta romperlas.
¿Qué es Hypothesis?
Hypothesis es una herramienta de pruebas generativas basada en el concepto de property-based testing. Esta librería fue creada para resolver un problema fundamental de las pruebas tradicionales: la imposibilidad de prever todos los posibles datos de entrada.
Principios básicos de funcionamiento
La librería funciona bajo el principio de "encontrar un contraejemplo". Cuando defines una propiedad de una función (por ejemplo, que el resultado de sumar dos números siempre es mayor que cada uno de los sumandos), Hypothesis genera múltiples conjuntos de datos de entrada y verifica si la propiedad se cumple para cada uno.
Ventajas frente a las pruebas tradicionales
- Cobertura automática de casos límite: Hypothesis encuentra por sí mismo combinaciones de datos raras y complejas
- Minimización de errores: Al detectar una falla, el test se simplifica automáticamente al ejemplo mínimo que la reproduce
- Alto rendimiento: La generación de miles de casos de prueba es rápida y eficiente
- Reproducibilidad: Los errores encontrados se pueden replicar fácilmente
Instalación y primeros pasos
Instalación de la librería
pip install hypothesis
Para funcionalidades adicionales, puedes instalarla con extensiones:
pip install hypothesis[numpy,pandas,django]
Ejemplo básico de uso
from hypothesis import given
import hypothesis.strategies as st
@given(st.integers(), st.integers())
def test_suma_conmutativa(a, b):
assert a + b == b + a
@given(st.integers(), st.integers(), st.integers())
def test_suma_asociativa(a, b, c):
assert (a + b) + c == a + (b + c)
Ejecutar los tests
Puedes ejecutar los tests con pytest, unittest o directamente:
pytest archivo_test.py
python -m unittest archivo_test.py
python archivo_test.py
Fundamentos de generación de datos
El decorador @given
El decorador @given() es el elemento central de Hypothesis. Indica qué estrategias de generación usar para crear los datos de prueba.
@given(st.integers())
def test_valor_absoluto(x):
assert abs(x) >= 0
@given(st.text(), st.integers(min_value=0))
def test_multiplicacion_cadena(s, n):
resultado = s * n
assert len(resultado) == len(s) * n
El módulo hypothesis.strategies
Todas las estrategias de generación de datos se encuentran en el módulo hypothesis.strategies, que normalmente se importa como st. Este módulo ofrece un amplio conjunto de estrategias predefinidas para diferentes tipos de datos.
Estrategias de generación de datos
Estrategias básicas
Hypothesis proporciona un extenso conjunto de estrategias integradas para generar varios tipos de datos:
# Tipos numéricos
st.integers() # Números enteros
st.floats() # Números de punto flotante
st.decimals() # Números decimales
# Datos de texto
st.text() # Cadenas Unicode
st.binary() # Cadenas de bytes
st.characters() # Caracteres individuales
# Lógi