Różnica między setUp () i setUpBeforeClass ()

159

Podczas testowania jednostkowego za pomocą JUnit istnieją dwie podobne metody setUp()i setUpBeforeClass(). Jaka jest różnica między tymi metodami? Jaka jest różnica między tearDown()i tearDownAfterClass()?

Oto podpisy:

@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
źródło

Odpowiedzi:

204

Metody @BeforeClassi @AfterClassadnotacje zostaną uruchomione dokładnie raz podczas testu - na samym początku i na końcu całego testu, zanim cokolwiek innego zostanie uruchomione. W rzeczywistości są one uruchamiane jeszcze przed skonstruowaniem klasy testowej, dlatego należy je zadeklarować static.

@BeforeI @Aftermetody będą uruchamiane przed i po każdym przypadku testowego, więc prawdopodobnie będzie uruchomić wiele razy podczas testu.

Więc załóżmy, że masz w swojej klasie trzy testy, kolejność wywołań metod byłaby następująca:

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
źródło
15

Pomyśl o „BeforeClass” jak o statycznym inicjatorze dla twojego przypadku testowego - użyj go do inicjowania statycznych danych - rzeczy, które nie zmieniają się w przypadku testów. Zdecydowanie chcesz uważać na zasoby statyczne, które nie są bezpieczne dla wątków.

Na koniec użyj metody z adnotacjami „AfterClass”, aby wyczyścić wszelkie ustawienia wykonane w metodzie z adnotacjami „BeforeClass” (chyba że ich samozniszczenie jest wystarczająco dobre).

„Przed” i „Po” służą do inicjalizacji specyficznej dla testów jednostkowych. Zwykle używam tych metod do inicjalizacji / ponownej inicjalizacji makiet moich zależności. Oczywiście ta inicjalizacja nie jest specyficzna dla testu jednostkowego, ale ogólna dla wszystkich testów jednostkowych.

madhurtanwani
źródło
Przy okazji, jeśli zaczynasz pisać testy jednostkowe, polecam ten garnek z mojego bloga. Zawiera również wskazówki do innych świetnych materiałów na temat testów jednostkowych: madhurtanwani.blogspot.com/search/label/mock
madhurtanwani
7

setUpBeforeClass jest uruchamiane przed wykonaniem jakiejkolwiek metody zaraz po konstruktorze (uruchamiane tylko raz)

setUp jest uruchamiany przed każdym wykonaniem metody

tearDown jest uruchamiane po każdym wykonaniu metody

tearDownAfterClass jest uruchamiana po wykonaniu wszystkich innych metod i jest ostatnią metodą do wykonania. (uruchom tylko raz dekonstruktor)

netbrain
źródło
5

Z Javadoc :

Czasami kilka testów musi współdzielić kosztowną obliczeniowo konfigurację (np. Logowanie do bazy danych). Chociaż może to zagrozić niezależności testów, czasami jest to konieczna optymalizacja. Dodanie adnotacji do public static voidmetody bezargumentowej za pomocą @BeforeClasspowoduje, że jest ona uruchamiana raz przed którąkolwiek z metod testowych w klasie. Te @BeforeClassmetody superklas zostanie uruchomiony przed tymi obecna klasa.

Justin King
źródło
Różnica polega na tym, że metoda setUpBeforeClass jest uruchamiana przed którymkolwiek z testów i jest uruchamiana raz; setUp jest uruchamiane raz przed każdym testem (i jest zwykle używane do resetowania stanu testowania do znanej dobrej wartości między testami).
Składnia