Как вы проверяете, что функция Python генерирует исключение?

http://www.technicalinterviewquestions.net/2009/03/print-2d-array-matrix-spiral-order.html

вот лучшее объяснение для вышеупомянутый ответ :) вместе с диаграммой:)

651
задан Aaron Hall 29 January 2015 в 20:00
поделиться

8 ответов

Используйте TestCase.assertRaises (или TestCase.failUnlessRaises) от unittest модуля, например:

import mymod

class MyTestCase(unittest.TestCase):
    def test1(self):
        self.assertRaises(SomeCoolException, mymod.myfunc)
563
ответ дан Robert Siemer 29 January 2015 в 20:00
поделиться

Код в моем предыдущем ответе может быть упрощен до:

def test_afunction_throws_exception(self):
    self.assertRaises(ExpectedException, afunction)

И если afunction берет аргументы, просто передайте их в assertRaises как это:

def test_afunction_throws_exception(self):
    self.assertRaises(ExpectedException, afunction, arg1, arg2)
271
ответ дан Chris Seymour 29 January 2015 в 20:00
поделиться

Ваш код должен следовать за этим шаблоном (это - 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 только проверки, если исключение было повышено.

45
ответ дан Robert Siemer 29 January 2015 в 20:00
поделиться

Я использую 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

10
ответ дан pi. 29 January 2015 в 20:00
поделиться

Взгляните на метод assertRaises unittest модуль.

9
ответ дан unflores 29 January 2015 в 20:00
поделиться

Я просто обнаружил, что библиотека Mock обеспечивает assertRaisesWithMessage () метод (в его unittest. Подкласс TestCase), который проверит не только, что ожидаемое исключение повышено, но также и что это повышено с ожидаемым сообщением:

from testcase import TestCase

import mymod

class MyTestCase(TestCase):
    def test1(self):
        self.assertRaisesWithMessage(SomeCoolException,
                                     'expected message',
                                     mymod.myfunc)
6
ответ дан Daryl Spitzer 29 January 2015 в 20:00
поделиться

В то время как все ответы прекрасно подходят, я искал способ протестировать, если функция повысила исключение, не полагаясь на платформы поблочного тестирования и имея необходимость к классам теста записи.

я закончил тем, что писал следующее:

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
0
ответ дан RUser4512 4 October 2019 в 08:51
поделиться

Начиная с 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))
432
ответ дан 22 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: