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