Чтобы сообщения об ошибках из моего модуля были информативными, я хотел бы видеть все сообщения об ошибках, обнаруженные assertRaises(). Сегодня я делаю это для каждого assertRaises(), но поскольку их в тестовом коде очень много, он становится очень утомительным.
Как распечатать сообщения об ошибках для всех assertRaises()? Я изучил документацию на http://docs.python.org/library/unittest.html, не выясняя, как ее решить. Могу ли я каким-либо образом обезвредить метод assertRaises()? Я предпочитаю не изменять все строки assertRaises() в тестовом коде, так как я чаще всего использую тестовый код стандартным способом.
Я думаю, этот вопрос связан с Python unittest: как я могу проверить аргумент в Exceptions?
Вот как я это делаю сегодня. Например:
#!/usr/bin/env python
def fail():
raise ValueError('Misspellled errrorr messageee')
И тестовый код:
#!/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()
Чтобы проверить сообщение об ошибке, я просто изменяю тип ошибки в assertRaises(), например, на IOError. Затем я вижу сообщение об ошибке:
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)
Любые предложения? /Джонас
EDIT:
С подсказками Роберта Россни мне удалось решить проблему. Он не предназначен главным образом для орфографических ошибок, но для обеспечения того, чтобы сообщения об ошибках были действительно значимыми для пользователя модуля. Обычная функциональность unittest (именно так я использую ее большую часть времени) достигается установкой SHOW_ERROR_MESSAGES = False.
Я просто переопределяю метод assertRaises(), как показано ниже. Он работает как шарм!
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])
Доля полученного результата:
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