Von: http://www.lengrand.fr/2011/12/pythonunittest-assertraises-raises-error/
Hier ist zunächst die entsprechende (immer noch dum :p) Funktion in der Datei dum_function.py :
def square_value(a):
"""
Returns the square value of a.
"""
try:
out = a*a
except TypeError:
raise TypeError("Input should be a string:")
return out
Hier ist der durchzuführende Test (nur dieser Test wird eingefügt):
import dum_function as df # import function module
import unittest
class Test(unittest.TestCase):
"""
The class inherits from unittest
"""
def setUp(self):
"""
This method is called before each test
"""
self.false_int = "A"
def tearDown(self):
"""
This method is called after each test
"""
pass
#---
## TESTS
def test_square_value(self):
# assertRaises(excClass, callableObj) prototype
self.assertRaises(TypeError, df.square_value(self.false_int))
if __name__ == "__main__":
unittest.main()
Wir sind nun bereit, unsere Funktion zu testen! Hier sehen Sie, was passiert, wenn Sie versuchen, den Test auszuführen:
======================================================================
ERROR: test_square_value (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_dum_function.py", line 22, in test_square_value
self.assertRaises(TypeError, df.square_value(self.false_int))
File "/home/jlengrand/Desktop/function.py", line 8, in square_value
raise TypeError("Input should be a string:")
TypeError: Input should be a string:
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
Der TypeError wird sofort ausgelöst und erzeugt einen Testfehler. Das Problem ist, dass dies genau das Verhalten ist, das wir wollten :s.
Um diesen Fehler zu vermeiden, führen Sie die Funktion einfach mit Lambda im Testaufruf aus:
self.assertRaises(TypeError, lambda: df.square_value(self.false_int))
Die endgültige Ausgabe :
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Perfekt!
... und für mich ist auch perfekt!!
Vielen Dank, Herr Julien Lengrand-Lambert
Diese Test-Assert gibt tatsächlich eine falsch positiv . Dies geschieht, weil das Lambda innerhalb von "assertRaises" die Einheit ist, die einen Typfehler auslöst und no die getestete Funktion.