2010-08-05 7 views
133

Beim Komponententest mit JUnit gibt es zwei ähnliche Methoden, setUp() und setUpBeforeClass(). Was ist der Unterschied zwischen diesen Methoden? Was ist der Unterschied zwischen tearDown() und tearDownAfterClass()?Unterschied zwischen setUp() und setUpBeforeClass()

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 { 
} 

Antwort

176

Die @BeforeClass und @AfterClass kommentierten Methoden wird genau einmal während des Testlaufs ausgeführt werden - ganz am Anfang und Ende des Tests als Ganzes, bevor irgendetwas anderes ausgeführt wird. Tatsächlich werden sie ausgeführt, bevor die Testklasse überhaupt erstellt wurde, weshalb sie als static deklariert werden müssen.

Die Methoden @Before und @After werden vor und nach jedem Testfall ausgeführt und werden daher wahrscheinlich während eines Testlaufs mehrmals ausgeführt.

Also lassen Sie uns annehmen, dass Sie in Ihrer Klasse drei Tests hatte, würde die Reihenfolge der Methodenaufrufe sein:

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() 
4

Von the Javadoc:

Manchmal müssen mehrere Tests rechnerisch teuer Setup teilen (wie in eine Datenbank Anmeldung). Dies kann zwar die Unabhängigkeit von Tests beeinträchtigen, ist jedoch manchmal eine notwendige Optimierung. Die Annotation einer public static void no-arg-Methode mit @BeforeClass bewirkt, dass sie einmal vor einer der Testmethoden in der Klasse ausgeführt wird. Die @BeforeClass Methoden der Superklassen werden vor denen der aktuellen Klasse ausgeführt.

+0

Der Unterschied ist, dass setUpBeforeClass vor jedem der Tests ausgeführt wird und einmal ausgeführt wird; setUp wird einmal vor jedem Test ausgeführt (und wird normalerweise verwendet, um den Teststatus zwischen den Tests auf einen bekannt guten Wert zurückzusetzen). – Syntax

6

setUpBeforeClass ausgeführt wird vor jeder Ausführung der Methode direkt nach dem Konstruktor (nur einmal ausgeführt)

Die Einrichtung ist vor jeder Ausführung der Methode laufen

tearDown nach jeder Methodenausführung ausgeführt wird

tearDownAfterClass ausgeführt nac Alle anderen Methodenausführungen sind die letzte auszuführende Methode. (run only deconstructor)

15

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

Verwenden Sie schließlich die Annotated-Methode "AfterClass", um alle Einstellungen zu bereinigen, die Sie in der Annotated-Methode "BeforeClass" durchgeführt haben (es sei denn, ihre Selbstzerstörung ist gut genug).

"Vor" & "Nach" sind für Komponententest spezifische 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.

+0

BTW, wenn Sie beginnen, Komponententest zu schreiben, würde ich diesen Topf von meinem Blog empfehlen. Es hat auch Hinweise auf andere großartige Materialien auf Unit-Tests: http://madhurtanwani.blogspot.com/search/label/mock – madhurtanwani