Я пишу тесты, и я слышал, как некоторые люди говорили, чтобы использовать 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, которые вы видели выше. Таким образом, в некоторых случаях это может сводиться только к кадровой/стилистической проблеме.