Las excepciones son lanzadas por las aplicaciones cuando estas no son utilizadas correctamente.
En el caso de las pruebas automatizadas, el probar si una excepción es lanzada correctamente, también se debe validar, de esta forma verificamos que nuestro método funciona cuando agregamos los valores correctamente, pero también validamos que lanzará la excepción correcta cuando no es utilizado correctamente.
A continuación, creamos el archivo test_exceptions.py, donde escribimos una primera prueba, que da como resultado una división por cero:
1 2 3 4 5 | def test_exception(): a = 0 b = 10 with pytest.raises(ZeroDivisionError): c = b / a |
En la siguiente prueba accedemos a la información de la excepción. Si tenemos la siguiente función:
1 2 3 4 | def divide(a, b): if b == 0: raise ValueError('Cannot divide by Zero') return a / b |
Si luego queremos validar que efectivamente se lanza la excepción que deseamos cuando se realiza una división por cero, se podría realizar de la siguiente forma:
1 2 3 4 | def test_zero_division(): with pytest.raises(ValueError) as exception_info: divide(1, 0) assert str(exception_info.value) == 'Cannot divide by Zero' |
Luego se puede utilizar el mensaje que va dentro de la instancia de ExceptionInfo para validar el resultado de nuestro test:
1 2 3 4 5 6 | def test_recursion_depth(): with pytest.raises(RuntimeError) as exception_info: def f(): f() f() assert "maximum recursion" in str(exception_info.value) |
Al observar el mensaje que lanza la excepción, se tiene la posibilidad de analizarla con más detalle. La variable exception_info es una instancia del tipo ExceptionInfo y tiene información de la excepción.
Ejercicio:
Si tiene la siguiente función:
1 2 3 4 5 | import pytest def deposit(money): if money < 0: raise ValueError('Cannot deposit negative sum') |
¿Que prueba o pruebas implementaría en la función si desea validar que el dinero depositado sea mayor que cero?
Referencias: