РЕДАКТИРОВАТЬ: переключился на лучший пример и пояснил, почему это настоящая проблема.
Я хотел бы написать модульные тесты на Python, которые продолжат выполнение при сбое утверждения, чтобы я мог видеть несколько сбоев в одном тесте. Например:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
Здесь цель теста - убедиться, что Car __init__
правильно устанавливает свои поля. Я мог бы разбить его на четыре метода (и это часто отличная идея), но в данном случае я думаю, что более читабельным будет оставить его как единственный метод, который проверяет одну концепцию («объект инициализирован правильно»).
Если мы предположим, что здесь лучше не разбивать метод, тогда у меня возникнет новая проблема: я не могу видеть сразу все ошибки. Когда я исправляю model
ошибку и повторно запускаю тест, wheel_count
появляется ошибка. Я бы сэкономил время, увидев обе ошибки при первом запуске теста.
Для сравнения, фреймворк модульного тестирования C ++ от Google различает нефатальные EXPECT_*
утверждения и фатальные ASSERT_*
утверждения:
Утверждения приходят парами, которые проверяют одно и то же, но по-разному влияют на текущую функцию. Версии ASSERT_ * генерируют фатальные отказы, когда они терпят неудачу, и прерывают текущую функцию. Версии EXPECT_ * генерируют нефатальные сбои, которые не прерывают текущую функцию. Обычно предпочтительнее EXPECT_ *, поскольку они позволяют сообщать о более чем одном сбое в тесте. Однако вы должны использовать ASSERT_ *, если нет смысла продолжать, когда рассматриваемое утверждение не выполняется.
Есть ли способ добиться EXPECT_*
подобного поведения в Python unittest
? Если нет unittest
, то существует ли другая среда модульного тестирования Python, которая поддерживает такое поведение?
Кстати, мне было любопытно, сколько реальных тестов могут выиграть от нефатальных утверждений, поэтому я просмотрел несколько примеров кода (отредактировано 2014-08-19 для использования кода поиска вместо Google Code Search, RIP). Из 10 случайно выбранных результатов с первой страницы все содержали тесты, которые делали несколько независимых утверждений в одном методе тестирования. Все выиграют от несмертельных утверждений.