JUnit Przypadki testowe @Before @BeforeClass Adnotacja

โšก Inteligentne podsumowanie

JUnit jest najszerzej stosowanym frameworkiem do testรณw jednostkowych Java, a jego adnotacje dotyczฤ…ce wyposaลผenia testowego dokล‚adnie kontrolujฤ…, co dzieje siฤ™ przed i po kaลผdym uruchomieniu metody testowej w klasie testowej.

  • ๐Ÿ”˜ Osprzฤ™t: Element testu to staล‚y kontekst obiektรณw i zasobรณw, w ktรณrych uruchamiany jest przypadek testowy.
  • ๏ธ Konfiguracja: @Before jest uruchamiane przed kaลผdฤ… metodฤ… testowฤ…, podczas gdy @BeforeClass jest uruchamiane raz przed caล‚ฤ… klasฤ….
  • โœ… Zburzyฤ‡: @After dziaล‚a po kaลผdym teล›cie, nawet gdy test wyrzuci bล‚ฤ…d lub potwierdzenie siฤ™ nie powiedzie.
  • ๐Ÿงช Zamรณwienie: Najpierw uruchamiana jest superklasa @Before, nastฤ™pnie podklasy @Before, @Test, a potem kaลผda klasa @After.
  • ๐Ÿ› ๏ธ. Biegacz: JUnitCore.runClasses() wykonuje klasy testowe i zwraca obiekt Result przechowujฤ…cy wszystkie bล‚ฤ™dy.
  • ๐Ÿ“Š JUnit 5: @Before, @After, @BeforeClass i @AfterClass stajฤ… siฤ™ @BeforeEach, @AfterEach, @BeforeAll i @AfterAll.

JUnit osprzฤ™t testowy z adnotacjami @Before i @BeforeClass

JUnit jest najpopularniejszฤ… jednostkฤ… Testy ramy w Java. Jest to wyraลบnie zalecane Testรณw jednostkowych. JUnit nie wymaga serwera do testowania aplikacji internetowej, dziฤ™ki czemu proces testowania jest szybki.

JUnit Framework umoลผliwia takลผe szybkie i ล‚atwe generowanie przypadkรณw testowych i danych testowych. The org.junit pakiet skล‚ada siฤ™ z wielu interfejsรณw i klas dla JUnit testowania, takie jak Test, Assert, After i Before. Szerszy JUnit rodzina opiera siฤ™ na tych samych elementach.

Czym jest przyrzฤ…d testowy?

Zanim zrozumiemy, czym jest element testowy, przyjrzyjmy siฤ™ poniลผszemu kodowi.

Ten kod zostaล‚ zaprojektowany do wykonania dwรณch przypadkรณw testowych na prostym pliku.

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

Niewiele jest tutaj kwestii

  • Kod jest nieczytelny.
  • Kod nie jest ล‚atwy w utrzymaniu.
  • Jeล›li zestaw testรณw jest zล‚oลผony, kod moลผe zawieraฤ‡ problemy logiczne.

Porรณwnaj ten sam kod za pomocฤ… JUnit.

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

Kod jest o wiele bardziej czytelny i ล‚atwiejszy w utrzymaniu. Powyลผsza struktura kodu to przyrzฤ…d pomiarowy.

Urzฤ…dzenie testowe to kontekst, w ktรณrym a JUnit Przypadek testowy biegnie. Zazwyczaj urzฤ…dzenia testowe obejmujฤ…:

  • Obiekty lub zasoby dostฤ™pne dla dowolnego przypadku testowego.
  • Wymagane dziaล‚ania, ktรณre udostฤ™pniajฤ… te obiekty i zasoby.
  • Te czynnoล›ci sฤ…
    1. alokacja (ustawienie)
    2. dealokacja (porzuca).

Konfiguracja i demontaลผ

Mecze majฤ… znaczenie, poniewaลผ JUnit stosuje te haki przy kaลผdym teล›cie.

  • Zwykle przed kaลผdym przypadkiem testowym naleลผy wykonaฤ‡ pewne powtarzajฤ…ce siฤ™ zadania. Przykล‚ad: utwรณrz poล‚ฤ…czenie z bazฤ… danych.
  • Podobnie na koล„cu kaลผdego przypadku testowego mogฤ… pojawiฤ‡ siฤ™ pewne powtarzajฤ…ce siฤ™ zadania. Przykล‚ad: do oczyszczenia po zakoล„czeniu wykonywania testu.
  • JUnit Zawiera adnotacje uล‚atwiajฤ…ce konfiguracjฤ™ i demontaลผ. Zapewnia zwolnienie zasobรณw i gotowoล›ฤ‡ systemu testowego do kolejnego przypadku testowego.

Te JUnit adnotacje omรณwiono poniลผej.

ustawienie

@Zanim adnotacja w JUnit jest uลผywany w metodzie zawierajฤ…cej Java kod, ktรณry naleลผy uruchomiฤ‡ przed kaลผdym przypadkiem testowym, tzn. kod, ktรณry naleลผy uruchomiฤ‡ przed kaลผdym wykonaniem testu.

Rozbiรณrka (niezaleลผnie od wyroku)

@Po adnotacja jest uลผywana w metodzie zawierajฤ…cej Java Kod do uruchomienia po kaลผdym przypadku testowym. Te metody zostanฤ… uruchomione nawet w przypadku wystฤ…pienia wyjฤ…tku w przypadku testowym lub w przypadku bล‚ฤ™dรณw asercji.

Uwaga:

  • Dopuszcza siฤ™ dowolnฤ… liczbฤ™ adnotacji wymienionych powyลผej.
  • Wszystkie metody z adnotacjฤ… @Zanim in JUnit bฤ™dฤ… uruchamiane przed kaลผdym przypadkiem testowym, ale mogฤ… byฤ‡ uruchamiane w dowolnej kolejnoล›ci.
  • Moลผesz dziedziczyฤ‡ metody @Before i @After z superklasy. Wykonanie przebiega nastฤ™pujฤ…co i jest standardowym procesem wykonania w JUnit.
  1. Wykonaj JUnit @Przed metodami w nadklasie
  2. Wykonaj metody @Before w tej klasie
  3. Wykonaj metodฤ™ @Test w tej klasie
  4. Wykonaj metody @After w tej klasie
  5. Wykonaj metody @After w nadklasie

JUnit Uwaga 5: te adnotacje sฤ… JUnit 4 (org.junit). JUnit 5 zmieniล‚o ich nazwy org.junit.jupiter.apii JUnit Poniลผszy kod 4 nadal dziaล‚a na starym silniku.

JUnit 4 adnotacje JUnit odpowiednik 5 (Jowisza) Dziaล‚a
@Zanim @BeforeEach Przed kaลผdฤ… metodฤ… testowฤ…
@Po @AfterEach Po kaลผdej metodzie testowej
@Przed zajฤ™ciami @BeforeAll Raz przed caล‚ฤ… klasฤ…
@Po zajฤ™ciach @Mimo wszystko Raz po caล‚ej klasie
@Ignorowaฤ‡ @Wyล‚ฤ…czony Pomija test z adnotacjami

Przykล‚ad: Tworzenie klasy z plikiem jako elementem testowym

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

W powyลผszym przykล‚adzie ล‚aล„cuch wykonania bฤ™dzie wyglฤ…daล‚ nastฤ™pujฤ…co. Diagram tracto jeden cykl tworzenia-testowania-usuwania na metodฤ™ testowฤ….

JUnit @Before i @After โ€“ ล‚aล„cuch wykonania wokรณล‚ dwรณch metod testowych

  1. utwรณrz plik wyjล›ciowy()
  2. plik testowy1()
  3. usuล„ plik wyjล›ciowy()
  4. utwรณrz plik wyjล›ciowy()
  5. plik testowy2()
  6. usuล„ plik wyjล›ciowy()

Zaล‚oลผenie:

testFile1() dziaล‚a przed testFile2(), co nie jest gwarantowane.

Konfiguracja jednorazowa

  • Moลผliwe jest uruchomienie metody tylko raz dla caล‚ej klasy testรณw przed wykonaniem ktรณregokolwiek z testรณw i przed jakimkolwiek innym @Zanim metoda(-y).
  • โ€žKonfiguracja jednorazowaโ€ jest przydatna do uruchamiania serwerรณw, nawiฤ…zywania poล‚ฤ…czeล„ i podobnych zadaล„. Zamykanie i ponowne otwieranie zasobรณw dla kaลผdego testu jest czasochล‚onne.
  • Moลผna to zrobiฤ‡ za pomocฤ… adnotacji @Przed zajฤ™ciami in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

Metoda musi byฤ‡ publiczna statyczna pustka, Poniewaลผ JUnit wywoล‚uje jฤ… zanim powstanie jakakolwiek instancja testowa.

Jednorazowe zburzenie

  • Podobnie jak w przypadku konfiguracji jednorazowej, dostฤ™pna jest rรณwnieลผ metoda jednorazowego czyszczenia. Jest ona uruchamiana po wszystkich metodach przypadkรณw testowych i @Po adnotacje zostaล‚y wykonane.
  • Przydatne do zatrzymaniaping serwerรณw i zamykanie ล‚ฤ…czy komunikacyjnych.
  • Moลผna to zrobiฤ‡ za pomocฤ… @Po zajฤ™ciach adnotacja.
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit Zestawy testowe

Po ustaleniu warunkรณw, powiฤ…zane klasy testowe sฤ… zazwyczaj grupowane i uruchamiane razem.

Jeล›li chcemy wykonaฤ‡ wiele testรณw w okreล›lonej kolejnoล›ci, moลผemy to zrobiฤ‡, ล‚ฤ…czฤ…c wszystkie testy w jednym miejscu. To miejsce nazywa siฤ™ zestawem testรณw. Wiฤ™cej szczegรณล‚รณw na temat wykonywania zestawรณw testรณw i ich wykorzystania wโ€ฆ JUnit sฤ… objฤ™te tym Tutorial.

JUnit Test Runner

JUnit udostฤ™pnia narzฤ™dzie do wykonywania przypadkรณw testowych.

  • JUnitrdzeล„ klasa sล‚uลผy do wykonywania tych testรณw.
  • Metoda tzw uruchomKlasy przez org.junit.runner.JUnitrdzeล„ sล‚uลผy do uruchomienia jednej lub kilku klas testowych.
  • Typ zwracany przez tฤ™ metodฤ™ to Wynik obiekt (org.junit.runner.Wynik), ktรณry sล‚uลผy do uzyskiwania dostฤ™pu do informacji o testach. Aby uzyskaฤ‡ wiฤ™cej informacji, zobacz poniลผszy przykล‚ad kodu.
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

W powyลผszym kodzie obiekt โ€žresultโ€ jest przetwarzany w celu uzyskania informacji o bล‚ฤ™dach i pomyล›lnych wynikach wykonywanych przez nas przypadkรณw testowych. Pomocnicy, tacy jak AssertEquals podnieล›ฤ‡ te awarie, podczas gdy @Ignorowaฤ‡ pomija test.

JUnit Uwaga 5: JUnitrdzeล„ jest JUnit 4 biegaczy. JUnit 5 zastฤ™puje go JUnit Platforma wyrzutnia API, zwykle uruchamiane przez IDE, Gradle lub Maven Surefire.

Imiฤ™ JUnit Program

Dobra znajomoล›ฤ‡ SDLC, Java programowanie i podstawy Testowanie oprogramowania proces pomaga w zrozumieniu JUnit program, podobnie jak wiedza o tym, jak testy jednostkowe rรณลผniฤ… siฤ™ od testรณw integracyjnych.

Zrozumiemy testowanie jednostkowe na ลผywym przykล‚adzie. Musimy utworzyฤ‡ klasฤ™ testowฤ… z metodฤ… testowฤ… adnotowanฤ… @Test jak podano poniลผej:

MojaFirstClassTest.java

package guru99.JUnit;		

import static org.junit.Assert.*;				

import org.junit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

Aby wykonaฤ‡ naszฤ… metodฤ™ testowฤ… (powyลผej), musimy utworzyฤ‡ program uruchamiajฤ…cy testy. W programie uruchamiajฤ…cym testy musimy dodaฤ‡ klasฤ™ testowฤ… jako parametr w JUnitMetoda runClasses() programu Core. Zwraca wynik testu w zaleลผnoล›ci od tego, czy test zakoล„czyล‚ siฤ™ pomyล›lnie, czy niepomyล›lnie.

Wiฤ™cej szczegรณล‚รณw znajdziesz w poniลผszym kodzie:

package guru99.JUnit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
            Result result = JUnitCore.runClasses(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Wydajnoล›ฤ‡

Pewnego razu TestRunner.java Wykonuje nasze metody testowe i otrzymujemy wynik jako niepowodzenie lub powodzenie. Poniลผej znajduje siฤ™ wyjaล›nienie wyniku:

  1. W tym przykล‚adzie po wykonaniu MojaFirstClassTest.java, test zostaล‚ zaliczony, a wynik jest zielony.
  2. Gdyby siฤ™ nie udaล‚o, wynik zostaล‚by wyล›wietlony na czerwono, a awariฤ™ moลผna zaobserwowaฤ‡ na wyล›wietlaczu. trace. Zobacz JUnit Poniลผej interfejs graficzny:

Eclipse JUnit widok pokazujฤ…cy zielony pasek zaliczenia testu MyFirstClassTest

FAQ

JUnit Tworzy nowฤ… instancjฤ™ klasy testowej dla kaลผdej metody testowej, dziฤ™ki czemu nie ma ลผadnej instancji, gdy kod na poziomie klasy musi zostaฤ‡ uruchomiony. Deklaracja metody static pozwala JUnit wywoล‚aฤ‡ go bezpoล›rednio.

Nie. Kolejnoล›ฤ‡ metod jest celowo nieokreล›lona. JUnit 4 oferty @FixMethodOrder i JUnit 5 ofert @TestMethodOrder, ale w zaleลผnoล›ci od kolejnoล›ci sygnaล‚รณw sprzฤ™ลผonych testรณw.

Metoda testowa nigdy nie jest wywoล‚ywana i jest zgล‚aszana jako bล‚ฤ…d, a nie awaria. Kaลผda metoda @After nadal dziaล‚a, wiฤ™c czyszczenie musi tolerowaฤ‡ czฤ™ล›ciowo zbudowanฤ… konfiguracjฤ™.

Nowe projekty powinny dodaฤ‡ JUnit 5 artefaktรณw zbiorczych org.junit.jupiter:junit-jupiter. Zespoล‚y posiadajฤ…ce dziedzictwo JUnit Do 4 pakietรณw dodano junit-vintage-engine, dziฤ™ki czemu oba dziaล‚ajฤ… na tej samej platformie.

Fixture to caล‚y przygotowany kontekst wokรณล‚ testu, obejmujฤ…cy rzeczywiste pliki lub poล‚ฤ…czenia. Mock to jeden zastฤ™pczy wspรณล‚pracownik ze skryptowanym zachowaniem, czฤ™sto tworzony przez fixture.

Tak, przez @BeforeClass w JUnit 4 lub @BeforeAll w JUnit 5. Wspรณล‚dzielone urzฤ…dzenia sฤ… szybsze, ale powodujฤ… wycieki stanu, dlatego naleลผy je przeznaczyฤ‡ na kosztowne zasoby przeznaczone wyล‚ฤ…cznie do odczytu.

Asystenci AI odczytujฤ… klasฤ™, wnioskujฤ… o potrzebnych wspรณล‚pracownikach i tworzฤ… konfiguracjฤ™ @Before z odpowiadajฤ…cym jej czyszczeniem @After. Zawsze samodzielnie sprawdzaj wygenerowane asercje.

Drugi pilot GitHub Tworzy szkielet klasy testowej na podstawie sygnatury metody, w tym adnotacji cyklu ลผycia. Czฤ™sto domyล›lnie JUnit 4 importy, wiฤ™c sprawdลบ, czy pakiet pasuje do Twojego silnika.

Podsumuj ten post nastฤ™pujฤ…co: