Каковы преимущества или различия в «assert False» и «self.assertFalse» - PullRequest
28 голосов
/ 02 июня 2010

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

Ответы [ 3 ]

36 голосов
/ 02 июня 2010

Если вы запустите

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), failureExeception поднимается.

Поскольку эти исключения одинаковы, видимой разницы нет.

Однако

assert и self.assertFalse отличаются в обычном использовании.

assert используется для объявления того, что определенное условие должно выполняться в определенной точке кода. Он используется в качестве опоры во время разработки, но не предназначен для использования в производственном коде. Если вы запускаете python -O my_unittest.py, все операторы assert игнорируются. Это может подорвать ваше предполагаемое использование assert, что может привести к прохождению ваших модульных тестов даже в случае сбоя.

Даже если (без флага -O) результат тот же, assert не предназначен для использования в коде модульного теста. Используйте self.assertTrue или self.assertFalse при написании модульных тестов.

27 голосов
/ 02 июня 2010

assert False выдает исключение без полезной информации. В тесте произошла ошибка.

self.assertFalse() выдает исключение при сбое теста с информацией о сбое теста, такой как сообщение и имя теста.

Существует разница между ошибкой - тест не может даже выполняться - и ошибкой - тестовый код работал, но выдает неправильный ответ.

Ошибки - серьезная проблема с вашим кодом.

Сбои - это просто сбои, которые необходимо исправить.

10 голосов
/ 02 июня 2010

В ответах, которые до сих пор не были упомянуты, есть одно замечание: существует несколько тестовых сред (например, py.test и nose ), которые используют магию самоанализа python, позволяющую вам писать модульные тесты вроде так:

# test_this_and_that.py
def test_frobber():
    assert frobber('x') == 'y'
# EOF

без использования какого-либо из шаблонов, которые вы видели выше. Так что в некоторых случаях это может сводиться только к рамочной / стилистической проблеме.

...