Estrutura UnitTest - Teste de exceções

A estrutura de teste Python fornece os seguintes métodos de asserção para verificar se as exceções são levantadas.

assertRaises (exceção, chamável, * args, ** kwds)

Teste se uma exceção (primeiro argumento) é gerada quando uma função é chamada com quaisquer argumentos posicionais ou de palavra-chave. O teste passa se a exceção esperada é levantada, é um erro se outra exceção é levantada ou falha se nenhuma exceção é levantada. Para capturar qualquer um de um grupo de exceções, uma tupla contendo as classes de exceção pode ser passada como exceção.

No exemplo abaixo, uma função de teste é definida para verificar se ZeroDivisionError é gerado.

import unittest

def div(a,b):
   return a/b
class raiseTest(unittest.TestCase):
   def testraise(self):
      self.assertRaises(ZeroDivisionError, div, 1,0)

if __name__ == '__main__':
   unittest.main()

A função testraise () usa a função assertRaises () para ver se a divisão por zero ocorre quando a função div () é chamada. O código acima irá gerar uma exceção. Mas altera os argumentos para a função div () da seguinte maneira -

self.assertRaises(ZeroDivisionError, div, 1,1)

Quando um código é executado com essas alterações, o teste falha, pois ZeroDivisionError não ocorre.

F
================================================================
FAIL: testraise (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "raisetest.py", line 7, in testraise
      self.assertRaises(ZeroDivisionError, div, 1,1)
AssertionError: ZeroDivisionError not raised

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

FAILED (failures = 1)

assertRaisesRegexp (exceção, regexp, chamável, * args, ** kwds)

Testa se regexp corresponde à representação de string da exceção gerada. regexp pode ser um objeto de expressão regular ou uma string contendo uma expressão regular adequada para uso por re.search ().

O exemplo a seguir mostra como assertRaisesRegexp () é usado -

import unittest
import re

class raiseTest(unittest.TestCase):
   def testraiseRegex(self):
      self.assertRaisesRegexp(TypeError, "invalid", reg,"Point","TutorialsPoint")
      
if __name__ == '__main__':
   unittest.main()

Aqui, o teste testraseRegex () não falha como primeiro argumento. "Point" é encontrado na segunda string de argumento.

================================================================
FAIL: testraiseRegex (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:/Python27/raiseTest.py", line 11, in testraiseRegex
      self.assertRaisesRegexp(TypeError, "invalid", reg,"Point","TutorialsPoint")
AssertionError: TypeError not raised
----------------------------------------------------------------------

No entanto, a mudança é mostrada abaixo -

self.assertRaisesRegexp(TypeError, "invalid", reg,123,"TutorialsPoint")

Uma exceção TypeError será lançada. Portanto, o seguinte resultado será exibido -

================================================================
FAIL: testraiseRegex (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "raisetest.py", line 11, in testraiseRegex
      self.assertRaisesRegexp(TypeError, "invalid", reg,123,"TutorialsPoint")
AssertionError: "invalid" does not match 
   "first argument must be string or compiled pattern"
----------------------------------------------------------------------