РЕДАКТИРОВАТЬ: переключился на лучший пример, и пояснил, почему это реальная проблема.
Я хотел бы написать модульные тесты на 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
. Это сэкономило бы мне время, чтобы увидеть обе ошибки при первом запуске теста.
Для сравнения, в модуле модульного тестирования Google C++ проводится различие между EXPECT_*
утверждениями EXPECT_*
и фатальными утверждениями ASSERT_*
:
Утверждения приходят парами, которые проверяют одно и то же, но по-разному влияют на текущую функцию. Версии ASSERT_ * генерируют фатальные сбои при сбое и отменяют текущую функцию. Версии EXPECT_ * генерируют нефатальные сбои, которые не отменяют текущую функцию. Обычно EXPECT_ * предпочтительнее, так как они позволяют сообщать о нескольких сбоях в тесте. Тем не менее, вы должны использовать ASSERT_ *, если не имеет смысла продолжать, когда утверждение не выполняется.
Есть ли способ получить EXPECT_*
-like в unittest
Python? Если нет в unittest
, то есть ли еще одна среда модульного тестирования Python, которая поддерживает это поведение?
Кстати, мне было любопытно, сколько реальных тестов может извлечь пользу из нефатальных утверждений, поэтому я посмотрел несколько примеров кода (отредактировано 2014-08-19, чтобы использовать поисковый код вместо Google Code Search, RIP). Из 10 случайно выбранных результатов с первой страницы все содержали тесты, которые сделали несколько независимых утверждений в одном и том же методе тестирования. Все извлекут выгоду из несмертельных утверждений.