BEARBEITEN: wechselte zu einem besseren Beispiel und stellte klar, warum dies ein echtes Problem ist.
Ich möchte Komponententests in Python schreiben, die weiterhin ausgeführt werden, wenn eine Zusicherung fehlschlägt, damit ich mehrere Fehler in einem einzigen Test sehen kann. Zum Beispiel:
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!
Hier besteht der Zweck des Tests darin, sicherzustellen, dass das Auto __init__seine Felder korrekt einstellt. Ich könnte es in vier Methoden aufteilen (und das ist oft eine großartige Idee), aber in diesem Fall denke ich, dass es besser lesbar ist, es als einzelne Methode beizubehalten, die ein einzelnes Konzept testet ("das Objekt ist korrekt initialisiert").
Wenn wir davon ausgehen, dass es hier am besten ist, die Methode nicht aufzubrechen, habe ich ein neues Problem: Ich kann nicht alle Fehler gleichzeitig sehen. Wenn ich den modelFehler behebe und den Test erneut ausführe, wird der wheel_countFehler angezeigt. Es würde mir Zeit sparen, beide Fehler zu sehen, wenn ich den Test zum ersten Mal ausführe.
Zum Vergleich unterscheidet das C ++ - Unit-Test-Framework von Google zwischen nicht schwerwiegenden EXPECT_*und schwerwiegenden ASSERT_*Behauptungen:
Die Behauptungen kommen paarweise, die dasselbe testen, aber unterschiedliche Auswirkungen auf die aktuelle Funktion haben. ASSERT_ * -Versionen erzeugen schwerwiegende Fehler, wenn sie fehlschlagen, und brechen die aktuelle Funktion ab. EXPECT_ * -Versionen erzeugen nicht schwerwiegende Fehler, die die aktuelle Funktion nicht abbrechen. Normalerweise werden EXPECT_ * bevorzugt, da dadurch mehr als ein Fehler in einem Test gemeldet werden kann. Sie sollten jedoch ASSERT_ * verwenden, wenn es nicht sinnvoll ist, fortzufahren, wenn die betreffende Zusicherung fehlschlägt.
Gibt es eine Möglichkeit, EXPECT_*bei Python ein ähnliches Verhalten zu erreichen unittest? Wenn nicht unittest, gibt es dann ein anderes Python-Unit-Test-Framework, das dieses Verhalten unterstützt?
Im Übrigen war ich neugierig, wie viele reale Tests von nicht schwerwiegenden Behauptungen profitieren könnten, und habe mir daher einige Codebeispiele angesehen (bearbeitet am 19.08.2014, um Suchcode anstelle von Google Code Search, RIP, zu verwenden). Von 10 zufällig ausgewählten Ergebnissen auf der ersten Seite enthielten alle Tests, die mehrere unabhängige Aussagen in derselben Testmethode machten. Alle würden von nicht tödlichen Behauptungen profitieren.