Comprobando Excepciones en Python Usando doctest

Al escribir código en Python, a menudo necesitamos asegurarnos de que nuestras funciones se comporten como se espera, especialmente en lo que respecta al manejo de errores. Un escenario común es probar si una función lanza una excepción bajo ciertas condiciones. Si usas el módulo doctest de Python para realizar tus pruebas, puedes preguntarte: ¿Puedo verificar que se lanza una excepción con doctest? La respuesta es un rotundo sí. Vamos a explorar cómo utilizar doctest para verificar excepciones en tus funciones de Python.

El Problema: Probar Excepciones

Considera una función llamada foo(x). Esta función está diseñada para lanzar una excepción si su argumento es menor que cero. La pregunta central aquí es cómo escribir un doctest que confirme que la función se comporta correctamente en este escenario. Específicamente, cuando pasamos un valor menor que cero, queremos asegurarnos de que se lance una excepción para indicar que algo salió mal.

Ejemplo de Función

Aquí hay una versión simple de la función foo(x):

def foo(x):
    if x < 0:
        raise ValueError("x debe ser no negativo")
    return x

La Solución: Escribir un doctest

Para crear un doctest que verifique excepciones, utilizaremos el siguiente enfoque. En nuestro doctest, podemos especificar que esperamos que se lance una excepción al llamar a foo() con un valor que debería desencadenar el error. Aquí está cómo hacerlo paso a paso:

Paso 1: Escribir el Doctest

En el docstring de tu función, puedes añadir un caso de prueba que demuestre la excepción esperada. Así es como se ve:

def foo(x):
    """
    Devuelve x si es no negativo.
    
    Lanza:
        ValueError: Si x < 0.
    
    Ejemplos:
    >>> foo(-1)
    Traceback (llamada más reciente de último):
      ...
    ValueError: x debe ser no negativo
    >>> foo(3)
    3
    """
    if x < 0:
        raise ValueError("x debe ser no negativo")
    return x

Paso 2: Ejecutar el Doctest

Para ejecutar el doctest, incluye el siguiente fragmento al final de tu script de Python:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

Paso 3: Salida Esperada

Cuando ejecutes el script, doctest procesará los ejemplos en el docstring. Si todo funciona correctamente, no verás ninguna salida (indicando que todas las pruebas pasaron). Si la excepción no se lanza como se esperaba, doctest informará un error.

Recursos Adicionales

Para obtener más información sobre cómo utilizar efectivamente doctest en tus módulos, consulta la documentación oficial del módulo doctest.

Conclusión

Usar doctest para verificar que las excepciones se lanzan correctamente no solo es posible; ¡es sencillo! Al añadir unas pocas líneas en el docstring de tu función, puedes documentar y probar efectivamente el comportamiento de tu código, asegurando que se adhiere a los patrones esperados. Ya sea que estés escribiendo nuevas funciones o probando existentes, doctest ofrece una poderosa manera de incluir pruebas impulsadas por ejemplos directamente junto a tu código. ¡Disfruta haciendo que tu código sea robusto, y feliz codificación!