Um sicherzustellen, dass die Fehlermeldungen von meinem Modul informativ sind, möchte ich alle von assertRaises () abgefangenen Fehlermeldungen sehen. Heute mache ich es für jede assertRaises (), aber da es viele davon im Testcode gibt, wird es sehr langweilig.
Wie kann ich die Fehlermeldungen für alle assertRaises () drucken? Ich habe die Dokumentation unter http://docs.python.org/library/unittest.html studiert, ohne herauszufinden, wie ich sie lösen kann. Kann ich die assertRaises () -Methode irgendwie monkeypatchen? Ich ziehe es vor, nicht alle assertRaises () -Zeilen im Testcode zu ändern, da ich den Testcode meistens standardmäßig verwende.
Ich denke, diese Frage bezieht sich auf Python unittest: Wie teste ich das Argument in einer Ausnahme?
So mache ich es heute. Zum Beispiel:
#!/usr/bin/env python
def fail():
raise ValueError('Misspellled errrorr messageee')
Und der Testcode:
#!/usr/bin/env python
import unittest
import failure
class TestFailureModule(unittest.TestCase):
def testFail(self):
self.assertRaises(ValueError, failure.fail)
if __name__ == '__main__':
unittest.main()
Um die Fehlermeldung zu überprüfen, ändere ich einfach den Fehlertyp in assertRaises () in beispielsweise IOError. Dann kann ich die Fehlermeldung sehen:
E
======================================================================
ERROR: testFail (__main__.TestFailureModule)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_failure.py", line 8, in testFail
self.assertRaises(IOError, failure.fail)
File "/usr/lib/python2.7/unittest/case.py", line 471, in assertRaises
callableObj(*args, **kwargs)
File "/home/jonas/Skrivbord/failure.py", line 4, in fail
raise ValueError('Misspellled errrorr messageee')
ValueError: Misspellled errrorr messageee
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Irgendwelche Vorschläge? / Jonas
BEARBEITEN:
Mit den Hinweisen von Robert Rossney gelang es mir, das Problem zu lösen. Es ist nicht hauptsächlich für Rechtschreibfehler gedacht, sondern um sicherzustellen, dass die Fehlermeldungen für den Benutzer des Moduls wirklich aussagekräftig sind. Die normale Funktionalität von unittest (so verwende ich es meistens) wird erreicht, indem SHOW_ERROR_MESSAGES = False gesetzt wird.
Ich überschreibe einfach die assertRaises () -Methode, wie unten gezeigt. Es funktioniert wie Charme!
SHOW_ERROR_MESSAGES = True
class NonexistantError(Exception):
pass
class ExtendedTestCase(unittest.TestCase):
def assertRaises(self, excClass, callableObj, *args, **kwargs):
if SHOW_ERROR_MESSAGES:
excClass = NonexistantError
try:
unittest.TestCase.assertRaises(self, excClass, callableObj, *args, **kwargs)
except:
print '\n ' + repr(sys.exc_info()[1])
Ein Bruchteil der resultierenden Ausgabe:
testNotIntegerInput (__main__.TestCheckRegisteraddress) ...
TypeError('The registeraddress must be an integer. Given: 1.0',)
TypeError("The registeraddress must be an integer. Given: '1'",)
TypeError('The registeraddress must be an integer. Given: [1]',)
TypeError('The registeraddress must be an integer. Given: None',)
ok
testCorrectNumberOfBytes (__main__.TestCheckResponseNumberOfBytes) ... ok
testInconsistentLimits (__main__.TestCheckNumerical) ...
ValueError('The maxvalue must not be smaller than minvalue. Given: 45 and 47, respectively.',)
ValueError('The maxvalue must not be smaller than minvalue. Given: 45.0 and 47.0, respectively.',)
ok
testWrongValues (__main__.TestCheckRegisteraddress) ...
ValueError('The registeraddress is too small: -1, but minimum value is 0.',)
ValueError('The registeraddress is too large: 65536, but maximum value is 65535.',)
ok
testTooShortString (__main__.TestCheckResponseWriteData) ...
ValueError("The payload is too short: 2, but minimum value is 4. Given: '\\x00X'",)
ValueError("The payload is too short: 0, but minimum value is 4. Given: ''",)
ValueError("The writedata is too short: 1, but minimum value is 2. Given: 'X'",)
ValueError("The writedata is too short: 0, but minimum value is 2. Given: ''",)
ok
testKnownValues (__main__.TestCreateBitPattern) ... ok
testNotIntegerInput (__main__.TestCheckSlaveaddress) ...
TypeError('The slaveaddress must be an integer. Given: 1.0',)
TypeError("The slaveaddress must be an integer. Given: '1'",)
TypeError('The slaveaddress must be an integer. Given: [1]',)
TypeError('The slaveaddress must be an integer. Given: None',)
ok
tryund untersuchenexcept?