Erläutern Sie die in Testfällen verwendeten Python-Methoden "setUp" und "tearDown"

93

Kann jemand die Verwendung von Pythons setUpund tearDownMethoden beim Schreiben von Testfällen erklären, die setUpunmittelbar vor dem Aufruf der Testmethode und tearDownunmittelbar nach dem Aufruf aufgerufen werden?

ANFÄNGER
quelle

Antworten:

85

Im Allgemeinen fügen Sie setUp alle erforderlichen Schritte und TearDown alle Bereinigungsschritte hinzu.

Weitere Beispiele finden Sie hier .

Wenn eine setUp () -Methode definiert ist, führt der Testläufer diese Methode vor jedem Test aus. Wenn eine tearDown () -Methode definiert ist, ruft der Testläufer diese Methode nach jedem Test auf.

Sie haben beispielsweise einen Test, für den Elemente vorhanden sein müssen, oder einen bestimmten Status. Sie fügen diese Aktionen (Erstellen von Objektinstanzen, Initialisieren der Datenbank, Vorbereiten von Regeln usw.) in setUp ein.

Wie Sie wissen, sollte jeder Test an der Stelle anhalten, an der er gestartet wurde. Dies bedeutet, dass wir den App-Status auf den ursprünglichen Zustand zurücksetzen müssen - z. B. Dateien schließen, Verbindungen herstellen, neu erstellte Elemente entfernen, Rückruf von Transaktionen aufrufen usw. - all dies Schritte sind in den TearDown aufzunehmen.

Die Idee ist also, dass der Test selbst nur Aktionen enthalten sollte, die für das Testobjekt ausgeführt werden müssen, um das Ergebnis zu erhalten, während setUp und tearDown die Methoden sind, mit denen Sie Ihren Testcode sauber und flexibel lassen können.

Sie können ein SetUp und ein TearDown für eine Reihe von Tests erstellen und diese in einer übergeordneten Klasse definieren. So können Sie solche Tests problemlos unterstützen und allgemeine Vorbereitungen und Bereinigungen aktualisieren.

Wenn Sie nach einem einfachen Beispiel suchen, verwenden Sie bitte den folgenden Link mit Beispiel

Artsiom Rudzenka
quelle
52

Mit diesen können Sie Code herausrechnen, der allen Tests in der Testsuite gemeinsam ist.

Wenn Ihre Tests häufig wiederholten Code enthalten, können Sie diese verkürzen, indem Sie diesen Code in setUp / tearDown verschieben.

Sie können dies zum Erstellen von Testdaten (z. B. Einrichten von Fälschungen / Verspottungen) oder zum Auslöschen von Funktionen mit Fälschungen verwenden.

Wenn Sie Integrationstests durchführen, können Sie die Umgebungsbedingungen in setUp überprüfen und den Test überspringen, wenn etwas nicht richtig eingerichtet ist.

Beispielsweise:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())
Matt Curtis
quelle
16
+1, weil die 9 Codezeilen alles sind, was ich brauche, um 100% zu groken. Elegantes, prägnantes Beispiel. Um ehrlich zu sein, sind diese 9 Zeilen das einzige, was ich auf der Seite gelesen habe, außer der Frage, die auch meine Frage war. Haben Sie vor dem Codebeispiel etwas auf Englisch gesagt? Es wurde nicht gebraucht! Der Code sagte alles! Danke Matt.
Nathan C. Tresch
2
Mir ist nicht klar, wie hier "Test überspringen, wenn etwas nicht richtig eingerichtet ist" demonstriert wird. Oder war das nur eine Seite?
user5359531
6

Angenommen, Sie haben eine Suite mit 10 Tests. 8 der Tests haben denselben Setup- / Teardown-Code. Die anderen 2 nicht.

Setup und Teardown bieten Ihnen eine gute Möglichkeit, diese 8 Tests zu überarbeiten. Was machst du nun mit den anderen 2 Tests? Sie würden sie in einen anderen Testfall / eine andere Suite verschieben. Die Verwendung von Setup und Teardown hilft also auch dabei, die Tests auf natürliche Weise in Fälle / Suiten zu unterteilen

John La Rooy
quelle
1
Manchmal ist es unerwünscht, die Tests in einen anderen Testfall zu verschieben. In diesem Fall können Sie einen Dekorateur mit dem Setup- / Teardown-Code schreiben und nur die gewünschten Testfunktionen dekorieren.
Matthijs
2
Dies ist keineswegs eine Antwort auf die Frage.
Gented