http://www.technicalinterviewquestions.net/2009/03/print-2d-array-matrix-spiral-order.html
вот лучшее объяснение для вышеупомянутый ответ :) вместе с диаграммой:)
Используйте TestCase.assertRaises
(или TestCase.failUnlessRaises
) от unittest модуля, например:
import mymod
class MyTestCase(unittest.TestCase):
def test1(self):
self.assertRaises(SomeCoolException, mymod.myfunc)
Код в моем предыдущем ответе может быть упрощен до:
def test_afunction_throws_exception(self):
self.assertRaises(ExpectedException, afunction)
И если afunction берет аргументы, просто передайте их в assertRaises как это:
def test_afunction_throws_exception(self):
self.assertRaises(ExpectedException, afunction, arg1, arg2)
Ваш код должен следовать за этим шаблоном (это - unittest тест стиля модуля):
def test_afunction_throws_exception(self):
try:
afunction()
except ExpectedException:
pass
except Exception as e:
self.fail('Unexpected exception raised:', e)
else:
self.fail('ExpectedException not raised')
На Python < 2,7 этих конструкции полезны для проверки определенные значения в ожидаемом исключении. Функция unittest assertRaises
только проверки, если исключение было повышено.
Я использую doctest[1] почти везде, потому что мне нравится то, что я документирую и тестирую свои функции одновременно.
Взглянули на этот код:
def throw_up(something, gowrong=False):
"""
>>> throw_up('Fish n Chips')
Traceback (most recent call last):
...
Exception: Fish n Chips
>>> throw_up('Fish n Chips', gowrong=True)
'I feel fine!'
"""
if gowrong:
return "I feel fine!"
raise Exception(something)
if __name__ == '__main__':
import doctest
doctest.testmod()
, Если Вы помещаете этот пример в модуль и выполняете его из командной строки, оба тестовых сценария оценены и проверены.
[1] документация Python: 23.2 doctest - Тест интерактивные примеры Python
Взгляните на метод assertRaises unittest
модуль.
Я просто обнаружил, что библиотека Mock обеспечивает assertRaisesWithMessage () метод (в его unittest. Подкласс TestCase), который проверит не только, что ожидаемое исключение повышено, но также и что это повышено с ожидаемым сообщением:
from testcase import TestCase
import mymod
class MyTestCase(TestCase):
def test1(self):
self.assertRaisesWithMessage(SomeCoolException,
'expected message',
mymod.myfunc)
В то время как все ответы прекрасно подходят, я искал способ протестировать, если функция повысила исключение, не полагаясь на платформы поблочного тестирования и имея необходимость к классам теста записи.
я закончил тем, что писал следующее:
def assert_error(e, x):
try:
e(x)
except:
return
raise AssertionError()
def failing_function(x):
raise ValueError()
def dummy_function(x):
return x
if __name__=="__main__":
assert_error(failing_function, 0)
assert_error(dummy_function, 0)
И это перестало работать на правильной строке:
Traceback (most recent call last):
File "assert_error.py", line 16, in <module>
assert_error(dummy_function, 0)
File "assert_error.py", line 6, in assert_error
raise AssertionError()
AssertionError
Начиная с Python 2.7, вы можете использовать диспетчер контекста для получения фактического сгенерированного объекта Exception:
import unittest
def broken_function():
raise Exception('This is broken')
class MyTestCase(unittest.TestCase):
def test(self):
with self.assertRaises(Exception) as context:
broken_function()
self.assertTrue('This is broken' in context.exception)
if __name__ == '__main__':
unittest.main()
http://docs.python.org/dev/library/unittest.html#unittest.TestCase.assertRaises
В Python 3.5 вы должны заключить context.exception
в str
, иначе вы получите TypeError
self.assertTrue('This is broken' in str(context.exception))