In Pythons Unittest fortfahren, wenn eine Assertion fehlschlägt

EDIT: geschaltet, um ein besseres Beispiel zu geben, und geklärt ist, warum das ist ein echtes problem.

Möchte ich schreiben von unit-tests in Python, die weiterhin ausgeführt werden, wenn eine assertion fehlschlägt, so dass ich sehen kann, mehrere Fehler in einem einzigen test. 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, der Zweck des Tests ist es sicherzustellen, dass Auto __init__ setzt seine Felder korrekt. Ich könnte brechen Sie in vier Methoden (und das ist oft eine gute Idee), aber in diesem Fall denke ich ist es besser lesbar zu halten, als eine einzelne Methode, dass die tests auf einem einzigen Konzept ("das Objekt korrekt initialisiert").

Wenn wir davon ausgehen, dass es hier am besten, um nicht zu brechen, bis Sie die Methode, dann habe ich ein neues problem: ich kann nicht sehen, alle Fehler auf einmal. Wenn ich fix die model Fehler und starten den test erneut, dann ist die wheel_count Fehler angezeigt. Es wäre sparen Sie Zeit hat mich zu sehen, dass beide Fehler, wenn ich zuerst den test ausführen.

Zum Vergleich, Google C++ unit-Test framework unterscheidet zwischen zwischen nicht-tödlichen EXPECT_* Behauptungen und tödlich ASSERT_* Behauptungen:

Die Behauptungen kommen in Paaren, testen Sie die gleiche Sache, aber haben unterschiedliche Auswirkungen auf die aktuelle Funktion. ASSERT_* Versionen erzeugen fatalen Fehler, wenn Sie scheitern und Abbruch der aktuellen Funktion. EXPECT_* Versionen erzeugen nicht schwerwiegende Fehler, die nicht zum Abbruch der aktuellen Funktion. In der Regel EXPECT_* werden bevorzugt, da Sie es erlauben, mehr als einen Fehler gemeldet werden, die in einem test. Sie sollten jedoch ASSERT_* wenn es keinen Sinn macht weiter zu machen, wenn die Behauptung in Frage, schlägt fehl.

Gibt es einen Weg, um EXPECT_*-wie Verhalten in Python unittest? Wenn nicht in unittest, dann ist es eine andere Python-unit-test-framework unterstützt dieses Verhalten?


Übrigens, ich war neugierig, wie viele real-life-tests profitieren könnten, von nicht-tödlichen Behauptungen, also schaute ich einige code-Beispiele (bearbeitet 2014-08-19 zu verwenden searchcode statt der Google-Code-Suche, RIP). Von 10 zufällig ausgewählte Ergebnisse aus der ersten Seite, alle enthaltenen Prüfungen, die aus mehreren unabhängigen Aussagen in die gleiche test Methode. Alle würden profitieren von nicht-fatalen Behauptungen.

Kommentar zu dem Problem
Was hast du am Ende dabei? Ich bin für dieses Thema interessiert (aus ganz anderen Gründen, die ich gerne diskutieren, auf einem geräumigen Platz als Kommentar) und würde gerne wissen, Ihre Erfahrung. Übrigens, die "code-Beispiele" - link endet mit "Leider ist dieser Dienst wurde heruntergefahren", also, wenn Sie eine zwischengespeicherte version, dass ich wäre daran interessiert es zu sehen. Kommentarautor: Davide
Für die Zukunft, glaube ich, dieser entspricht die Suche auf das aktuelle system, aber die Ergebnisse werden nicht mehr wie oben beschrieben. Kommentarautor: ZAD-Man
@Davide, ich wollte nicht am Ende etwas zu tun. "Nur eine Behauptung pro-Methode" Ansatz scheint zu starr dogmatisch zu mir, aber die einzige brauchbare (und vertretbare) Lösung zu sein scheint Anthony ' s "catch and append" Vorschlag. Das ist zu hässlich für mich, obwohl, so dass ich gerade steckte mit mehreren behauptet, die pro-Methode, und ich werde zu Leben haben, mit dem laufen tests mehr Zeit als nötig, um herauszufinden, alle Fehler. Kommentarautor: Bruce Christensen

InformationsquelleAutor der Frage Bruce Christensen | 2011-01-19

Schreibe einen Kommentar