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.