Я хочу написать тест, чтобы установить, что Исключение не возникает в определенных обстоятельствах.
Это просто для тестирования , если исключение будет поднято ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... но как вы можете сделать обратное .
Что-то вроде этого я, что я после ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
Главкон
источник
источник
assertNotRaises
метод, который разделяет 90% своего кода / поведенияassertRaises
примерно через 30 строк кода. Смотрите мой ответ ниже для деталей.hypothesis
чтобы убедиться, что они выдают одинаковый вывод для всех видов ввода, игнорируя при этом случаи, когда оригинал вызывает исключение.assume(func(a))
не работает, потому что выходные данные могут быть массивом с неоднозначным значением истинности. Поэтому я просто хочу вызвать функцию и получить,True
если она не дает сбоя.assume(func(a) is not None)
работы я думаюОтветы:
источник
ValueError
, ноValueError
вместо этого оно поднимается, ваш тест должен завершиться с условием сбоя, а не с ошибкой. С другой стороны, если при запуске того же кода вы вызовете aKeyError
, это будет ошибкой, а не ошибкой. В Python - в отличие от некоторых других языков - исключения обычно используются для потока управления, поэтому у насexcept <ExceptionName>
действительно есть синтаксис. В связи с этим, решение user9876 просто неверно.Это предположение по умолчанию - исключения не возникают.
Если вы не говорите ничего другого, это предполагается в каждом тесте.
Вам не нужно писать какое-либо утверждение для этого.
источник
Просто вызовите функцию. Если это вызывает исключение, структура модульного тестирования помечает это как ошибку. Вы можете добавить комментарий, например:
источник
xfail
Я оригинальный постер, и я принял приведенный выше ответ DGH, но не использовал его в коде.
Как только я использовал, я понял, что для того, чтобы сделать то, что мне нужно, нужно немного подправить (чтобы быть справедливым по отношению к DGH, он / она сказал «или что-то подобное»!).
Я думал, что здесь стоит опубликовать твик для блага других:
То, что я пытался сделать здесь, состояло в том, чтобы гарантировать, что, если была сделана попытка создать экземпляр объекта Application со вторым аргументом пробелов, pySourceAidExceptions.PathIsNotAValidOne будет вызван.
Я полагаю, что использование приведенного выше кода (в значительной степени основанного на ответе DGH) сделает это.
источник
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
должен сделать работу в этом случае.Вы можете определить
assertNotRaises
, повторно используя около 90% первоначальной реализацииassertRaises
вunittest
модуле. При таком подходе вы в конечном итоге получаетеassertNotRaises
метод, который, помимо своего условия обратного сбоя, ведет себя идентичноassertRaises
.TLDR и живая демонстрация
Оказалось, что добавить
assertNotRaises
метод к удивительно легкоunittest.TestCase
(у меня ушло примерно в 4 раза больше времени, чтобы написать этот ответ, чем при написании кода). Вот живая демонстрацияassertNotRaises
метода в действии . Точно так жеassertRaises
, вы можете либо передать вызываемый объект и аргументыassertNotRaises
, либо использовать его вwith
выражении. Демонстрационная версия включает тестовые примеры, которые демонстрируют, чтоassertNotRaises
работает как задумано.подробности
Реализация
assertRaises
inunittest
довольно сложна, но с небольшим количеством умных подклассов вы можете переопределить и отменить условие сбоя.assertRaises
это короткий метод, который в основном просто создает экземплярunittest.case._AssertRaisesContext
класса и возвращает его (см. его определение вunittest.case
модуле). Вы можете определить свой собственный_AssertNotRaisesContext
класс, создав подкласс_AssertRaisesContext
и переопределив его__exit__
метод:Обычно вы определяете классы тестовых наборов, наследуя их от
TestCase
. Если вы вместо этого наследуете от подклассаMyTestCase
:у всех ваших тестовых случаев теперь есть
assertNotRaises
метод, доступный для них.источник
traceback
в вашемelse
заявлении приходят?import
. Это исправленоможет быть изменено, если вам нужно принять параметры.
называть как
источник
Я нашел это полезным для monkey-patch
unittest
следующим образом:Это проясняет намерение при тестировании на отсутствие исключения:
Это также упрощает тестирование в цикле, который я часто выполняю:
источник
assertMayRaise
кunittest.TestSuite
вам может просто делать вид , что частьunittest
библиотеки.Если вы передаете класс Exception в
assertRaises()
, предоставляется менеджер контекста. Это может улучшить читаемость ваших тестов:Это позволяет вам проверять ошибки в вашем коде.
В этом случае вы проверяете,
PathIsNotAValidOne
когда вы передаете неверные параметры конструктору приложения.источник
Вы можете попробовать так. try: self.assertRaises (None, function, arg1, arg2) кроме: pass, если вы не поместите код в блок try, это произойдет через исключение «AssertionError: None not воспитано», и тестовый случай будет пройден. Тестовый пример будет пройден если положить внутрь, попробуйте блок, который ожидается поведение.
источник
Один прямой способ убедиться, что объект инициализируется без каких-либо ошибок, - это проверить экземпляр типа объекта.
Вот пример:
источник