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

35
chrissygormley 2 Июн 2010 в 17:33

3 ответа

Лучший ответ

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

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

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

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

Сбои - это просто сбои, которые нужно исправить.

30
S.Lott 2 Июн 2010 в 13:35

Если ты бежишь

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 при написании модульных тестов.

40
wim 2 Ноя 2015 в 18:31

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

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

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

10
as. 2 Июн 2010 в 15:13