Afin de m'assurer que les messages d'erreur de mon module sont informatifs, j'aimerais voir tous les messages d'erreur capturés par assertRaises(). Aujourd'hui, je le fais pour chaque assertRaises(), mais comme il y en a beaucoup dans le code de test, cela devient très fastidieux.
Comment puis-je imprimer les messages d'erreur pour tous les assertRaises() ? J'ai étudié la documentation sur http://docs.python.org/library/unittest.html sans savoir comment le résoudre. Puis-je d'une manière ou d'une autre monkeypater la méthode assertRaises() ? Je préfère ne pas changer toutes les lignes de assertRaises() dans le code de test, car j'utilise le plus souvent le code de test de manière standard.
Je suppose que cette question est liée à Python unittest : comment tester l'argument dans une Exceptions ?
Voici comment je procède aujourd'hui. Par exemple :
#!/usr/bin/env python
def fail():
raise ValueError('Misspellled errrorr messageee')
Et le code de test :
#!/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()
Pour vérifier le message d'erreur, je change simplement le type d'erreur dans la fonction assertRaises() en IOError, par exemple. Je peux alors voir le message d'erreur :
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)
Des suggestions ? /Jonas
EDITAR:
Grâce aux conseils de Robert Rossney, j'ai réussi à résoudre le problème. Il ne s'agit pas principalement de corriger les fautes d'orthographe, mais de s'assurer que les messages d'erreur sont vraiment significatifs pour l'utilisateur du module. La fonctionnalité normale d'unittest (c'est ainsi que je l'utilise la plupart du temps) est obtenue en mettant SHOW_ERROR_MESSAGES = False.
Je surcharge simplement la méthode assertRaises(), comme indiqué ci-dessous. Cela fonctionne à merveille !
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])
Une fraction du résultat obtenu :
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