Probar si una función arroja una excepción en Python

El marco de pruebas unitarias unittest se utiliza para validar que el código funciona según lo diseñado. Para lograr esto, unittest admite algunos métodos importantes de forma orientada a objetos:  

  • accesorio de prueba
  • caso de prueba
  • Banco de pruebas
  • corredor de pruebas

Se puede obtener una visión más profunda de los términos anteriores en https://www.geeksforgeeks.org/unit-testing-python-unittest/

assertRaises() : permite encapsular una excepción, lo que significa que la prueba puede lanzar una excepción sin salir de la ejecución, como suele ser el caso de las excepciones no controladas. La prueba pasa si se genera una excepción, da un error si se genera otra excepción o falla si no se genera ninguna excepción.

Hay dos formas de usar assertRaises:

  1. utilizando argumentos de palabras clave.
    assertRaises(exception, function, *args, **keywords)
    

    Simplemente pase la excepción, la función invocable y los parámetros de la función invocable como argumentos de palabra clave que provocarán la excepción.

  2. usando el administrador de contexto 
    assertRaises(exception)
    

    Realice una llamada de función que debería generar la excepción con un contexto. El administrador de contexto detectará una excepción y la almacenará en el objeto en su atributo de excepción. Esto es útil cuando tenemos que realizar comprobaciones adicionales sobre la excepción planteada.

Escribimos una prueba unitaria que falla si una función no lanza una excepción o cuando una excepción lanzada por una declaración de afirmación es diferente de la excepción esperada . Por lo tanto, con este método podemos verificar si una función genera una excepción o no.

Ejemplo 1 :

Python3

import unittest
  
class MyTestCase(unittest.TestCase):
  
   # Returns true if 1 + '1' raises a TypeError
   def test_1(self):
      with self.assertRaises(Exception):
         1 + '1'
  
if __name__ == '__main__': 
    unittest.main()

Producción : 

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Aquí, en la salida el «.» en la primera línea de salida significa que la prueba pasó y la función lanzó una excepción de   TypeError al agregar un valor entero y un valor de string .

Ejemplo 2:

Python3

import unittest
  
class MyTestCase(unittest.TestCase):
  
   # Returns false if 1 + 1 raises no Exception
   def test_1(self):
      with self.assertRaises(Exception):
         1 + 1
  
if __name__ == '__main__': 
    unittest.main()

Producción : 

F
======================================================================
FAIL: test_1 (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/5bc65171e57a3294596f5333f4b7ed53.py", line 6, in test_1
    1 + 1
AssertionError: Exception not raised

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

Dado que sumar un entero a otro entero (en este caso, 1 + 1) no genera ninguna excepción, la prueba unitaria falla.

Ejemplo 3:

Python3

import unittest
  
class MyTestCase(unittest.TestCase):
  
  # Returns true if 100 / 0 raises an Exception
   def test_1(self):
      with self.assertRaises(ZeroDivisionError):
         100 / 0
  
if __name__ == '__main__': 
    unittest.main()

Producción :

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Cualquier número dividido por 0 da la excepción ZeroDivisionError . Por lo tanto, en el ejemplo 3, cuando 100 se divide por 0, genera una excepción de tipo ZeroDivisionError, lo que hace que se apruebe unittest. De este modo «.» en la salida significa que se ha pasado la prueba.

Ejemplo 4:

Python3

import unittest
  
class MyTestCase(unittest.TestCase):
  
  # Returns true if GeeksforGeeks.txt file is not present and raises an EnvironmentError
  # Exception
  # In this example expected exception is RuntimeError while generated exception is
  # EnvironmentError, thus returns false
    def test_1(self):
        with self.assertRaises(RuntimeError):
            file = open("GeeksforGeeks.txt", 'r')
  
if __name__ == '__main__':
    unittest.main()

Producción :

E
======================================================================
ERROR: test_1 (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/8520c06939bb0023b4f76f381b2c8cf2.py", line 11, in test_1
    file = open("GeeksforGeeks.txt", 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'GeeksforGeeks.txt'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

Cuando intentamos abrir un archivo que no existe, genera un IOError que es una subclase de EnvironmentError . En el ejemplo anterior, la prueba de unidad falló porque se esperaba que el tipo de excepción que generaría la función fuera del tipo RuntimeError , en lugar de eso, generó una excepción de EnvironmentError . Dado que la excepción generada y la excepción esperada son diferentes, produce un error.

Publicación traducida automáticamente

Artículo escrito por rohanchopra96 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *