Для того, щоб переконатись, що повідомлення про помилки з мого модуля є інформативними, я хотів би бачити всі повідомлення про помилки, виявлені assertRaises (). Сьогодні я роблю це для кожного assertRaises (), але оскільки їх багато в тестовому коді, це стає дуже нудно.
Як я можу надрукувати повідомлення про помилки для всіх assertRaises ()? Я вивчив документацію на http://docs.python.org/library/unittest.html, не з'ясувавши, як її вирішити. Чи можу я якось виправити мавпу методом assertRaises ()? Я вважаю за краще не змінювати всі рядки assertRaises () у тестовому коді, оскільки найчастіше використовую тестовий код стандартним способом.
Думаю, це питання пов’язане з Python unittest: як перевірити аргумент у винятках?
Ось як я це роблю сьогодні. Наприклад:
#!/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)
Будь-які пропозиції? / Джонас
РЕДАГУВАТИ:
З натяками Роберта Росні мені вдалося вирішити проблему. Він в основному не призначений для орфографічних помилок, а для того, щоб переконатися, що повідомлення про помилки дійсно значущі для користувача модуля. Нормальна функціональність 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
try
таexcept
?