EDYCJA: przełączono na lepszy przykład i wyjaśniono, dlaczego jest to prawdziwy problem.
Chciałbym napisać testy jednostkowe w Pythonie, które będą kontynuowane, gdy asercja nie powiedzie się, tak żebym mógł zobaczyć wiele niepowodzeń w jednym teście. Na przykład:
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!
Tutaj celem testu jest upewnienie się, że Car's __init__
poprawnie ustawia pola. Mógłbym podzielić to na cztery metody (i często jest to świetny pomysł), ale w tym przypadku bardziej czytelne jest zachowanie go jako pojedynczej metody, która testuje pojedynczą koncepcję („obiekt jest poprawnie zainicjowany”).
Jeśli założymy, że najlepiej tutaj nie przerywać metody, to mam nowy problem: nie widzę wszystkich błędów naraz. Kiedy naprawię model
błąd i ponownie uruchomię test, wheel_count
pojawia się błąd. Zaoszczędziłoby mi to czas, aby zobaczyć oba błędy podczas pierwszego uruchomienia testu.
Dla porównania, Google w C ++ framework testów jednostkowych rozróżnia między niezakończonych zgonem EXPECT_*
twierdzeń i śmiertelnych ASSERT_*
twierdzeń:
Twierdzenia występują w parach, które testują to samo, ale mają różny wpływ na bieżącą funkcję. Wersje ASSERT_ * generują krytyczne błędy w przypadku niepowodzenia i przerywają bieżącą funkcję. Wersje EXPECT_ * generują niepowodzenia niekrytyczne, które nie przerywają bieżącej funkcji. Zwykle preferowane są EXPECT_ *, ponieważ pozwalają na zgłoszenie więcej niż jednego błędu w teście. Należy jednak użyć ASSERT_ *, jeśli nie ma sensu kontynuować, gdy dane stwierdzenie zawodzi.
Czy istnieje sposób, aby uzyskać EXPECT_*
podobne zachowanie w Pythonie unittest
? Jeśli nie unittest
, to czy istnieje inna platforma testów jednostkowych Pythona, która obsługuje to zachowanie?
Nawiasem mówiąc, byłem ciekawy, ile rzeczywistych testów może skorzystać na niekrytycznych asercjach, więc przyjrzałem się kilku przykładom kodu (edytowanym 2014-08-19, aby używać kodu wyszukiwania zamiast Google Code Search, RIP). Spośród 10 losowo wybranych wyników z pierwszej strony wszystkie zawierały testy, które zawierały wiele niezależnych stwierdzeń w tej samej metodzie testowej. Wszyscy skorzystaliby na twierdzeniach nie prowadzących do śmierci.