Unterschied zwischen setUp () und setUpBeforeClass ()

159

Wenn die Einheit mit JUnit Prüfung gibt es zwei ähnliche Verfahren setUp()und setUpBeforeClass(). Was ist der Unterschied zwischen diesen Methoden? Was ist der Unterschied zwischen tearDown()und tearDownAfterClass()?

Hier sind die Unterschriften:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}
Sagar Varpe
quelle

Antworten:

204

Die @BeforeClassund die mit @AfterClassAnmerkungen versehenen Methoden werden während Ihres Testlaufs genau einmal ausgeführt - ganz am Anfang und am Ende des gesamten Tests, bevor etwas anderes ausgeführt wird. Tatsächlich werden sie ausgeführt, bevor die Testklasse überhaupt erstellt wurde, weshalb sie deklariert werden müssen static.

Die @Beforeund @AfterMethoden werden vor und nach jedem Testfall ausgeführt werden, so wird wahrscheinlich mehrere Male während eines Testlaufs ausgeführt werden.

Nehmen wir also an, Sie hatten drei Tests in Ihrer Klasse. Die Reihenfolge der Methodenaufrufe wäre:

setUpBeforeClass()

  (Test class first instance constructed and the following methods called on it)
    setUp()
    test1()
    tearDown()

  (Test class second instance constructed and the following methods called on it)
    setUp()
    test2()
    tearDown()

  (Test class third instance constructed and the following methods called on it)
    setUp()
    test3()
    tearDown()

tearDownAfterClass()
Andrzej Doyle
quelle
15

Stellen Sie sich "BeforeClass" als statischen Initialisierer für Ihren Testfall vor - verwenden Sie ihn zum Initialisieren statischer Daten - Dinge, die sich in Ihren Testfällen nicht ändern. Sie sollten auf jeden Fall vorsichtig mit statischen Ressourcen sein, die nicht threadsicher sind.

Verwenden Sie schließlich die mit Annotationen versehene Methode "AfterClass", um alle Einstellungen zu bereinigen, die Sie mit der mit Annotationen versehenen Methode "BeforeClass" vorgenommen haben (es sei denn, ihre Selbstzerstörung ist gut genug).

"Vorher" und "Nachher" dienen zur Unit-Test-spezifischen Initialisierung. Normalerweise verwende ich diese Methoden, um die Mocks meiner Abhängigkeiten zu initialisieren / neu zu initialisieren. Offensichtlich ist diese Initialisierung nicht spezifisch für einen Komponententest, sondern allgemein für alle Komponententests.

madhurtanwani
quelle
Übrigens, wenn Sie anfangen, Unit-Test zu schreiben, würde ich diesen Topf aus meinem Blog empfehlen. Es enthält auch Hinweise
madhurtanwani
7

setUpBeforeClass wird vor jeder Methodenausführung direkt nach dem Konstruktor ausgeführt (nur einmal ausgeführt).

setUp wird vor jeder Methodenausführung ausgeführt

tearDown wird nach jeder Methodenausführung ausgeführt

tearDownAfterClass wird nach allen anderen Methodenausführungen ausgeführt und ist die letzte auszuführende Methode. (nur einmal Dekonstruktor ausführen)

Netzhirn
quelle
5

Aus dem Javadoc :

Manchmal müssen mehrere Tests ein rechenintensives Setup gemeinsam nutzen (z. B. die Anmeldung bei einer Datenbank). Dies kann zwar die Unabhängigkeit von Tests beeinträchtigen, ist jedoch manchmal eine notwendige Optimierung. Wenn Sie eine public static voidMethode ohne Argument mit @BeforeClasskommentieren, wird sie einmal vor einer der Testmethoden in der Klasse ausgeführt. Die @BeforeClassMethoden von Oberklassen werden vor denen der aktuellen Klasse ausgeführt.

Justin King
quelle
Der Unterschied besteht darin, dass setUpBeforeClass vor einem der Tests ausgeführt und einmal ausgeführt wird. setUp wird vor jedem Test einmal ausgeführt (und wird normalerweise verwendet, um den Teststatus zwischen den Tests auf einen bekanntermaßen guten Wert zurückzusetzen).
Syntax