Я не согласен с доминирующим мнением о том, что для каждого утверждения следует написать метод проверки. Есть ситуации, когда вы хотите проверить несколько вещей в одном методе тестирования. Вот мой ответ, как это сделать:
# Works with unittest in Python 2.7
class ExpectingTestCase(unittest.TestCase):
def run(self, result=None):
self._result = result
self._num_expectations = 0
super(ExpectingTestCase, self).run(result)
def _fail(self, failure):
try:
raise failure
except failure.__class__:
self._result.addFailure(self, sys.exc_info())
def expect_true(self, a, msg):
if not a:
self._fail(self.failureException(msg))
self._num_expectations += 1
def expect_equal(self, a, b, msg=''):
if a != b:
msg = '({}) Expected {} to equal {}. '.format(self._num_expectations, a, b) + msg
self._fail(self.failureException(msg))
self._num_expectations += 1
А вот некоторые ситуации, когда я думаю, что это полезно и не рискованно:
1) Если вы хотите проверить код для разных наборов данных. Здесь у нас есть функция add (), и я хочу протестировать ее с несколькими примерами входных данных. Написать 3 метода испытаний для 3 наборов данных означает повторять себя, что плохо. Особенно, если звонок был более сложным.
class MyTest(ExpectingTestCase):
def test_multiple_inputs(self):
for a, b, expect in ([1,1,2], [0,0,0], [2,2,4]):
self.expect_equal(expect, add(a,b), 'inputs: {} {}'.format(a,b))
2) Если вы хотите проверить несколько выходов функции. Я хочу проверить каждый вывод, но не хочу, чтобы первый сбой маскировал два других.
class MyTest(ExpectingTestCase):
def test_things_with_no_side_effects(self):
a, b, c = myfunc()
self.expect_equal('first value', a)
self.expect_equal('second value', b)
self.expect_equal('third value', c)
3) Тестирование с большими затратами на установку. Тесты должны выполняться быстро, иначе люди перестанут их использовать. Некоторые тесты требуют подключения к БД или сети, которое занимает секунду, что действительно замедляет ваш тест. Если вы тестируете само соединение с БД, то вам, вероятно, нужно принять удар по скорости. Но если вы тестируете что-то не связанное, мы хотим выполнить медленную настройку один раз для всего набора проверок.