Я пишу тесты, и я слышал, как некоторые люди говорили, чтобы использовать self.assertFalse а не assert False. Почему это и есть ли какие-либо преимущества?
Каковы преимущества или различия в "assert False" и "self.assertFalse",
Ответ 1
assert False генерирует исключение без полезной информации о регистрации. У теста была ошибка.
self.assertFalse() выдает исключение с ошибкой тестирования с информацией об ошибке тестирования, например, сообщение и тестовое имя.
Там разница между тестом ошибок не могла даже выполняться - и сработал код проверки отказа, но дал неправильный ответ.
Ошибки представляют собой серьезную проблему с вашим кодом.
Отказы - это просто сбои, которые необходимо устранить.
Ответ 2
Если вы запустите
import unittest
class Test_Unittest(unittest.TestCase):
def test_assert(self):
assert False
def test_assertFalse(self):
self.assertFalse(True)
if __name__ == '__main__':
unittest.main()
Вы получаете ту же информацию о регистрации, тот же сбой:
FF
======================================================================
FAIL: test_assert (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/unutbu/pybin/test.py", line 6, in test_assert
assert False
AssertionError
======================================================================
FAIL: test_assertFalse (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse
self.assertFalse(True)
AssertionError
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=2)
Причина, по которой оба обрабатываются одинаково, заключается в том, что unittest.TestCase определяет
failureException = AssertionError
Когда вы произнесете assert False, появится AssertionError.
Когда вы произнесете self.assertFalse(True), появится a failureExeception.
Поскольку эти исключения одинаковы, нет явной разницы.
assert и self.assertFalse отличаются друг от друга в обычном использовании.
assert используется для объявления того, что определенное условие должно выполняться в определенной точке кода. Он используется как костыль во время разработки, но не предназначен для использования в производственном коде. Если вы запустите python -O my_unittest.py, все утверждения assert игнорируются. Это может подорвать ваше предполагаемое использование assert, возможно, чтобы ваши модульные тесты проходили, даже если произошел сбой.
Хотя (без флага -O) результат тот же, assert не предназначен для использования в unit test коде. Используйте self.assertTrue или self.assertFalse при написании модульных тестов.
Ответ 3
В одном из ответов, которые до сих пор не упоминалось, есть несколько тестовых фреймворков (например, py.test и nose), которые используют магию интроспекции python, чтобы вы могли писать модульные тесты следующим образом:
# test_this_and_that.py
def test_frobber():
assert frobber('x') == 'y'
# EOF
не требуя ни одного из шаблонов unittest, которые вы видели выше. Таким образом, в некоторых случаях это может сводиться только к кадровой/стилистической проблеме.