Вопрос

В unittest я хочу сделать что-то вроде:

result = myFunction()
self.assertFalse(result) OR self.assertRaises(Exception, myFunction)

с идеей, заключающейся в том, что если реализация myFunction изменения, возвращающие значение false вместо создания исключения (или наоборот), тест по-прежнему будет вести себя корректно (т.е.укажите на неположительный результат).

Возможно ли что-то подобное?

Это было полезно?

Решение

Вы можете проверить, если myFunction() вызывает конкретное исключение:

try:
    self.assertFalse(myFunction())
except SpecificException:
    pass

В этом случае, если myFunction() повышения SpecificException это было бы молча проигнорировано.

Другими словами, вы бы увидели, что тест завершился неудачей в двух случаях:любой myFunction() вызывает исключение, которого вы не ждете, или результат myFunction() вызов не вычисляется для False.


В случае, если ваша функция может генерировать какое-либо исключение, вы можете проверить, поймали ли вы исключение AssertionError в блоке except и повторно запустите его, молча игнорируя другие исключения:

try:
    self.assertFalse(myFunction())
except AssertionError:
    raise
except:
    pass

Обратите внимание, что мне это кажется не очень интуитивным и понятным.В идеальном мире вам нужно было бы справляться с этими двумя ситуациями по отдельности:создайте тест, который позволил бы myFunction() привести к False и еще один, который заставил бы его вызвать исключение.

Другие советы

Вы могли бы, но это сделает ваш тест слабее.Каждый другой модульный тест, использующий myFunction, должен будет предполагать, что он может либо вызвать исключение, либо вернуть False - или иначе тот тест может прерваться при изменении поведения.

Если все ваши другие тесты будут учитывать эту неопределенность, то все эти фрагменты кода будет сложнее писать.И с какой целью?Выгода сомнительная.

Вместо этого сделайте определенный тест, который использует assertRaises.Пусть тест завершится неудачей, если реализация изменится, и затем измените тест на assertFalse.Это изменение также может привести к сбою других тестов, и это хорошо.Это заставит вас пересмотреть варианты использования для myFunction, и последствия для изменения поведения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top