Was ist der Unterschied zwischen setUp()
und setUpClass()
im Python- unittest
Framework?
Der Hauptunterschied (wie in der Antwort von Benjamin Hodgson erwähnt) besteht darin, dass setUpClass
er nur einmal und vor allen Tests setUp
aufgerufen wird , während er unmittelbar vor jedem einzelnen Test aufgerufen wird. (Hinweis: Gleiches gilt für die entsprechenden Methoden in anderen xUnit-Testframeworks, nicht nur für Pythons unittest
.)
Aus der unittest
Dokumentation :
setUpClass()
Eine Klassenmethode, die aufgerufen wird, bevor Tests in einer einzelnen Klasse ausgeführt werden. setUpClass wird mit der Klasse als einzigem Argument aufgerufen und muss als Klassenmethode () dekoriert werden:
@classmethod
def setUpClass(cls):
...
und:
setUp()
Methode zur Vorbereitung der Prüfvorrichtung. Dies wird unmittelbar vor dem Aufruf der Testmethode aufgerufen. Mit Ausnahme von AssertionError oder SkipTest wird jede durch diese Methode ausgelöste Ausnahme eher als Fehler als als Testfehler betrachtet. Die Standardimplementierung führt nichts aus.
Warum sollte das Setup in einer Methode über der anderen behandelt werden?
Dieser Teil der Frage wurde noch nicht beantwortet. Gemäß meinem Kommentar als Antwort auf die Antwort von Gearon ist die setUp
Methode für Elemente des Geräts gedacht, die allen Tests gemeinsam sind (um zu vermeiden, dass dieser Code in jedem Test dupliziert wird). Ich finde dies oft nützlich, da das Entfernen von Duplikaten (normalerweise) die Lesbarkeit verbessert und den Wartungsaufwand verringert.
Die setUpClass
Methode ist für teure Elemente gedacht, die Sie lieber nur einmal ausführen müssen, z. B. das Öffnen einer Datenbankverbindung, das Öffnen einer temporären Datei im Dateisystem, das Laden einer gemeinsam genutzten Bibliothek zum Testen usw. Wenn Sie solche Dinge vor jedem Test ausführen, wird der Vorgang verlangsamt Testsuite zu viel, deshalb machen wir es nur einmal vor allen Tests. Dies ist eine leichte Verschlechterung der Unabhängigkeit der Tests, in einigen Situationen jedoch eine notwendige Optimierung. Vermutlich sollte man solche Dinge nicht in Unit-Tests tun, da es normalerweise möglich ist, die Datenbank / das Dateisystem / die Bibliothek / was auch immer zu verspotten, ohne die reale Sache zu verwenden. Als solches finde ich, dass setUpClass
das selten benötigt wird. Dies ist jedoch nützlich, wenn das Testen der obigen Beispiele (oder ähnlicher Beispiele) erforderlich wird.