Parametrización de Pruebas en Pytest: Uso Avanzado del Decorador

Análisis de Parámetros

def parametrize(self, parametros, valores, indirecto=False, ids=None, alcance=None):
    """
    Genera múltiples invocaciones de prueba usando valores parametrizados.
    
    :param parametros: Nombres de argumentos (cadena o lista/tupla)
    :param valores: Lista de valores para los parámetros
    :param indirecto: Controla si los valores se pasan a fixtures
    :param ids: Identificadores personalizados para casos de prueba
    :param alcance: Define el ámbito de los parámetros
    """

parametros

Nombres de variables separados por comas (ej: "a,b,resultado").

valores

Lista de conjuntos de valores. Para un parámetro: [1, 2, 3]. Para múltiples: [("x",10), ("y",20)].

ids

Identificadores legibles para casos de prueba (ej: ["suma_positiva", "suma_negativa"]).

indirecto

Cuando es True, los valores se pasan a fixtures durante la configuración.

Aplicación en Clases de Prueba

import pytest

datos = [(3, 3, 9), (4, 5, 20)]

def multiplicar(x, y):
    return x * y

@pytest.mark.parametrize('num1,num2,esperado', datos)
class EjemploPruebas:
    def test_multiplicacion_1(self, num1, num2, esperado):
        assert multiplicar(num1, num2) == esperado
        
    def test_multiplicacion_2(self, num1, num2, esperado):
        assert multiplicar(num1, num2) ** 2 == esperado ** 2

Resultado: Cada método de prueba ejecuta todos los conjuntos de datos.

Aplicación en Funciones de Prueba

Parámetro Único

colores = ["rojo", "azul"]

@pytest.mark.parametrize("color", colores)
def test_colores(color):
    assert isinstance(color, str)

Múltiples Parámetros

operaciones = [
    [10, 2, 12],
    [5, -3, 2]
]

@pytest.mark.parametrize('x,y,res', operaciones)
def test_suma(x, y, res):
    assert x + y == res

Combinación de Parámetros

valores_a = [1, 2]
valores_b = ['a', 'b']

@pytest.mark.parametrize('a', valores_a)
@pytest.mark.parametrize('b', valores_b)
def test_combinacion(a, b):
    print(f"Combinación: {a}-{b}")

Genera pruebas para todas las combinaciones (4 casos).

Marcadores Especiales

@pytest.mark.parametrize("entrada,esperado", [
    ("2+2", 4),
    ("3*3", 9),
    pytest.param("6/0", 0, marks=pytest.mark.xfail),
    pytest.param("1-1", 0, marks=pytest.mark.skip)
])
def test_evaluacion(entrada, esperado):
    assert eval(entrada) == esperado

Estructuras Complejas

usuarios = (
    {'usuario': "admin", 'clave': "secreta"},
    {'usuario': "invitado", 'clave': "temp"}
)

@pytest.mark.parametrize('credenciales', usuarios)
def test_login(credenciales):
    assert 'usuario' in credenciales

Mejorar Legibilidad con IDs

datos_suma = [(10, 5, 15), (7, 3, 10)]
nombres = [f"{x}+{y}={r}" for x,y,r in datos_suma]

@pytest.mark.parametrize('a,b,res', datos_suma, ids=nombres)
def test_suma_detallada(a, b, res):
    assert a + b == res

Los IDs personalizados clarifican los casos en los reportes.

Etiquetas: pytest parametrizacion pruebas-unitarias Python

Publicado el 6-23 16:33