pytest.raises: Cómo Probar Excepciones en Python resuelve un problema frecuente en proyectos Python: Demuestra que una entrada inválida falla de la forma prevista y en el punto correcto. Esta guía explica el mecanismo, presenta un ejemplo ejecutable y marca los límites que evitan una implementación frágil.

Concepto y caso de uso

pytest.raises es un context manager que falla si no ocurre una excepción compatible. El argumento match aplica una expresión regular al texto.

Para repasar los fundamentos relacionados, consulta también la guía de pytest. La integración es más simple cuando cada función recibe dependencias y datos explícitamente en lugar de depender de estado global.

Ejemplo práctico

import pytest


def divide(a: float, b: float) -> float:
    if b == 0:
        raise ValueError("divisor must not be zero")
    return a / b


def test_zero_divisor():
    with pytest.raises(ValueError, match="must not be zero") as exc:
        divide(10, 0)
    assert exc.value.args[0] == "divisor must not be zero"

Coloca dentro del bloque solo la llamada que debe fallar. Después inspecciona exc.value para atributos relevantes de excepciones de dominio.

Decisiones importantes

La elección correcta depende del contrato público, del volumen y del comportamiento ante fallos.

Considera concurrencia, entradas vacías y fallos parciales. Documenta cada límite que afecte a consumidores y usa nombres que expresen intención.

Errores frecuentes

El ejemplo mínimo no sustituye límites, manejo de errores y observabilidad. Un bloque grande puede capturar el tipo correcto en la línea equivocada. Capturar Exception vuelve impreciso el contrato y comparar todo el mensaje hace frágil la prueba.

Evita capturar excepciones sin contexto o devolver resultados parciales como si fueran completos. Un fallo explícito suele ser más seguro que datos silenciosamente incorrectos.

Cómo validar

Valida el comportamiento y no solo el camino feliz. Añade un caso válido junto al inválido y decide si las subclases son aceptables según el contrato público.

La documentación oficial, consultada el 28 de julio de 2026, detalla la API y debe ser la referencia para cambios futuros.