Подтвердить что ты не робот

Каковы преимущества или различия в "assert False" и "self.assertFalse",

Я пишу тесты, и я слышал, как некоторые люди говорили, чтобы использовать self.assertFalse а не assert False. Почему это и есть ли какие-либо преимущества?

4b9b3361

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