Testing con pytest
1. Introducción a pytest #
pytest es una herramienta poderosa y fácil de usar para realizar pruebas en Python. Es muy popular porque es más simple y flexible que unittest, y te permite escribir pruebas de manera concisa. pytest automáticamente encuentra y ejecuta tus pruebas sin necesidad de mucha configuración.
2. Instalación de pytest #
Antes de empezar, necesitas instalar pytest. Puedes hacerlo con pip:
1pip install pytest
3. Creación y ejecución de pruebas con pytest #
Para crear pruebas con pytest, simplemente escribe funciones de prueba en archivos cuyos nombres empiecen con test_ o terminen con _test.py. Las funciones de prueba deben empezar también con test_.
Ejemplo básico con pytest #
Supongamos que tienes una función en un archivo llamado mi_codigo.py:
Archivo: mi_codigo.py
1def suma(a, b): 2 return a + b
Ahora, crea un archivo de prueba:
Archivo: test_mi_codigo.py
1def test_suma(): 2 assert suma(3, 5) == 8 3 assert suma(-1, 1) == 0 4 assert suma(0, 0) == 0
- ¿Qué hace este código?:
- Define una función de prueba
test_suma. - Usa
assertpara verificar quesuma(a, b)devuelve el resultado esperado. - Si cualquier
assertfalla,pytestlo reportará como una prueba fallida.
- Define una función de prueba
4. Ejecutar pruebas con pytest #
Para ejecutar las pruebas, simplemente abre la terminal o línea de comandos y escribe:
1pytest
pytest buscará automáticamente archivos que empiecen con test_ o terminen con _test.py y ejecutará todas las funciones de prueba que encuentre.
- Resultado en pantalla si todas las pruebas pasan:
=========================== test session starts ============================ collected 1 item test_mi_codigo.py . [100%] =========================== 1 passed in 0.01s =============================
Este resultado indica que todas las pruebas pasaron.
5. Pruebas paramétricas #
Las pruebas paramétricas te permiten ejecutar una misma prueba con diferentes conjuntos de datos, lo que es muy útil para evitar la duplicación de código de prueba.
Ejemplo de pruebas paramétricas con pytest #
1import pytest 2from mi_codigo import suma 3 4@pytest.mark.parametrize("a, b, resultado_esperado", [ 5 (3, 5, 8), 6 (-1, 1, 0), 7 (0, 0, 0), 8 (-2, -3, -5) 9]) 10def test_suma_parametrica(a, b, resultado_esperado): 11 assert suma(a, b) == resultado_esperado
-
¿Qué hace este código?:
- Usa el decorador
@pytest.mark.parametrizepara pasar diferentes combinaciones de valores a la funcióntest_suma_parametrica. pytestejecuta la función de prueba una vez por cada conjunto de parámetros.
- Usa el decorador
-
Resultado en pantalla:
=========================== test session starts ============================ collected 4 items test_mi_codigo.py .... [100%] =========================== 4 passed in 0.01s =============================
Esto indica que todas las combinaciones de pruebas pasaron.
6. Fixtures en pytest #
Las fixtures en pytest son funciones que te permiten establecer un contexto común para varias pruebas. Son útiles para preparar el entorno antes de que se ejecuten las pruebas, como inicializar una base de datos o crear archivos temporales.
Ejemplo de uso de fixtures con pytest #
1import pytest 2 3@pytest.fixture 4def datos_de_prueba(): 5 return {"a": 3, "b": 5, "resultado_esperado": 8} 6 7def test_suma_con_fixture(datos_de_prueba): 8 a = datos_de_prueba["a"] 9 b = datos_de_prueba["b"] 10 resultado_esperado = datos_de_prueba["resultado_esperado"] 11 assert suma(a, b) == resultado_esperado
-
¿Qué hace este código?:
- Define una fixture llamada
datos_de_pruebaque devuelve un diccionario con datos. - La prueba
test_suma_con_fixtureusa esta fixture para obtener los datos y realizar la prueba.
- Define una fixture llamada
-
Resultado en pantalla:
=========================== test session starts ============================ collected 1 item test_mi_codigo.py . [100%] =========================== 1 passed in 0.01s =============================
Esto indica que la prueba con la fixture pasó correctamente.
Resumen del tema
Conceptos clave #
- Convención de Descubrimiento de Pruebas: archivos
test_*.pyo*_test.pyy funcionestest_*(). - Aserciones Nativas: utiliza la sentencia estándar de Python
assert condicion, "mensaje opcional"con inspección detallada de fallos. - Parametrización (
@pytest.mark.parametrize): ejecuta una misma función de prueba contra múltiples combinaciones de entradas y salidas esperadas sin duplicar código. - Inyección de Dependencias con Fixtures (
@pytest.fixture): funciones reutilizables que preparan y limpian recursos del entorno de pruebas pasándose como argumentos a los tests.
Qué debes recordar #
pytest simplifica las pruebas en Python mediante aserciones simples (assert), parametrización declarativa y gestión modular de dependencias con fixtures.