Gestión de Pruebas Omitidas y Fallos Esperados en Pytest

Manejo de Casos de Prueba Inejecutables

Pytest permite marcar pruebas que no deben ejecutarse o que se espera que fallen, manteniendo el estado exitoso del connjunto de pruebas. Dos estrategias clave son:

  • Skip: Omite pruebas bajo condiciones específicas
  • xFail: Marca pruebas con fallos esperados

Visualice estados especiales usando:

pytest -rxXs  # Muestra skips, xfails y xpasses

Omitir Pruebas (Skip)

Omitir incondicionalmente:

@pytest.mark.skip(motivo="Funcionalidad no disponible")
def prueba_servicio_externo():
    ...

Omitir durante ejecución:

def prueba_configuracion():
    if not configuracion_valida():
        pytest.skip("Configuración incompatible")

Omitir módulos completos:

import pytest
if not tiene_dependencias():
    pytest.skip("Dependencias faltantes", allow_module_level=True)

Skip Condicional (skipif)

@pytest.mark.skipif(sys.version_info < (3, 8), motivo="Requiere Python ≥3.8")
def prueba_api_nueva():
    ...

Marcador compartido:

# modulo_shared.py
req_version = pytest.mark.skipif(
    lib.__version__ < "2.0", motivo="Versión mínima 2.0"
)

# test_modulo.py
from modulo_shared import req_version

@req_version
def prueba_funcionalidad():
    ...

Omitir Clases y Módulos

# Omitir clase completa
@pytest.mark.skipif(platform.system() != "Linux", motivo="Solo Linux")
class TestLinuxFeatures:
    ...

# Omitir módulo completo
pytestmark = pytest.mark.skipif(not tiene_acceso_db(), motivo="BD no disponible")

Manejo de Dependencias

pandas = pytest.importorskip("pandas", minversion="1.2")

Manejo de Fallos Esperados (xFail)

@pytest.mark.xfail
def prueba_experimental():
    ...

Marcado dinámico:

def prueba_inestable():
    if ambiente_produccion():
        pytest.xfail("Inestable en producción")

Parámetros Clave

Modo estricto:

@pytest.mark.xfail(strict=True)  # XPASS falla el test
def prueba_critica():
    ...

Especificar excepción:

@pytest.mark.xfail(raises=ValueError)
def prueba_formato():
    ...

Ejecución controlada:

@pytest.mark.xfail(run=False)  # No ejecutar
def prueba_peligrosa():
    ...

Combinación con Parametrización

@pytest.mark.parametrize("entrada,esperado", [
    (2, 3),
    pytest.param(0, 1, marks=pytest.mark.xfail),
    pytest.param(5, 6, marks=pytest.mark.skipif(not soporte_hex(), motivo="Sistema no compatible"))
])
def prueba_incremento(entrada, esperado):
    assert entrada + 1 == esperado

Etiquetas: pytest testing skip xfail test_management

Publicado el 6-16 22:47