JUnit Samouczek adnotacji z przykładem: Co to są @Test i @After

⚡ Inteligentne podsumowanie

JUnit adnotacje są formą metadanych składniowych dodawanych do Java kod źródłowy, dzięki czemu osoba przeprowadzająca test wie, które metody wykonać, kiedy je uruchomić i ile czasu może zająć każda z nich.

  • 🔘 @Test: Oznacza publiczną metodę void, która JUnit wykonuje się jako pojedynczy przypadek testowy.
  • Koło życia: @Before i @After obejmują każdy test, podczas gdy @BeforeClass i @AfterClass obejmują klasę.
  • Kontrola: @Ignore pomija test, @Test(timeout) ogranicza czas wykonania, @Test(expected) zgłasza wyjątek.
  • 🧪 Asercje: org.junit.Assert dostarcza assertEquals, assertTrue, assertNull, assertSame i fail().
  • 🛠️. Dziedzictwo: TestCase, TestResult i TestSuite należą do starszego pakietu junit.framework.
  • 📊 JUnit 5: Jupiter zmienia nazwy na @BeforeEach, @AfterEach, @BeforeAll, @AfterAll i @Disabled.

JUnit samouczek dotyczący adnotacji obejmujący @Test, @Before i @After

Czym jest JUnit Adnotacje?

JUnit adnotacje są specjalną formą metadanych składniowych, które można dodać do Java kod źródłowy dla lepszej czytelności i struktury kodu. Zmienne, parametry, pakiety, metody i klasy można adnotować. Adnotacje wprowadzono w JUnit 4, co sprawia, że Java kod jest bardziej czytelny i prostszy. To jest wielka różnica między JUnit 3 i JUnit 4: JUnit 4 jest oparty na adnotacjach.

Mając praktyczną wiedzę na temat tych adnotacji, można łatwo nauczyć się i wdrożyć JUnit test. Poniżej znajdują się ważne i często używane JUnit lista adnotacji z JUnit 5 (Jowisz) odpowiednik obok każdego z nich:

S. No. Adnotacje OPIS JUnit 5 równoważnych
1. @Test Ta adnotacja zastępuje junit.framework.TestCase i wskazuje, że publiczną metodę void, do której jest dołączona, można wykonać jako przypadek testowy. @Test (org.junit.jupiter.api)
2. @Zanim Adnotacji tej używa się, jeśli przed każdym przypadkiem testowym chcesz wykonać jakąś instrukcję, na przykład warunki wstępne. @BeforeEach
3. @Przed zajęciami Tę adnotację należy stosować, gdy chcesz wykonać pewne polecenia przed wszystkimi przypadkami testowymi, na przykład połączenie testowe, które musi zostać otwarte przed wszystkimi przypadkami testowymi. @BeforeAll
4. @Po Tej adnotacji można użyć, jeśli chcesz wykonać kilka instrukcji po każdej Przypadek testowyna przykład resetowanie zmiennych lub usuwanie plików tymczasowych. @AfterEach
5. @Po zajęciach Adnotację tę można wykorzystać, jeśli chcesz wykonać pewne polecenia po wykonaniu wszystkich przypadków testowych, na przykład zwolnić zasoby po wykonaniu wszystkich przypadków testowych. @Mimo wszystko
6. @Ignorować Adnotację tę można wykorzystać, jeśli chcesz zignorować niektóre polecenia podczas wykonywania testu, na przykład wyłączyć niektóre przypadki testowe podczas wykonywania testu. @Wyłączony
7. @Test(limit czasu=500) Tę adnotację można wykorzystać, jeśli chcesz ustalić limit czasu podczas wykonywania testów, na przykład jeśli pracujesz w ramach SLA (umowy o poziomie usług) i testy muszą zostać ukończone w określonym czasie. @Timeout lub assertTimeout
8. @Test(oczekiwany=IllegalArgumentException.class) Ta adnotacja może być użyta, jeśli chcesz obsłużyć jakiś wyjątek podczas wykonywania testu. Na przykład, jeśli chcesz sprawdzić, czy dana metoda zgłasza określony wyjątek, czy nie. assertThrows

JUnit Przykład adnotacji

Stwórzmy klasę obejmującą valid JUnit adnotacje za pomocą prostych instrukcji drukowania i wykonaj je za pomocą klasy uruchamiającej test:

Krok 1) Rozważ poniższe Java klasa posiadająca różne metody, które są dołączone do powyższych adnotacji:

JunitAnnotationsExample.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Krok 2) Utwórzmy klasę uruchamiającą testy, aby wykonać powyższy test:

TestRunner.java

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(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Spodziewany wynik

  • Wszystkie przypadki testowe będą wykonywane jeden po drugim, a wszystkie polecenia drukowania będą widoczne na konsoli.
  • Jak omówiono w powyższej tabeli, @Before i @BeforeClass w JUnit [Metody m2() i m1()] będą wykonywane przed każdym przypadkiem testowym i przed wszystkimi przypadkami testowymi.
  • W ten sam sposób @After i @AfterClass w JUnit (metody m4() i m3()) zostaną wykonane odpowiednio po każdym przypadku testowym i po wszystkich przypadkach testowych. @Ignore (metoda m6()) zostanie potraktowana jako ignorowanie testu.

Przeanalizujmy przypadki testowe użyte powyżej Java klasa w szczegółach:

  1. Rozważ metodę m5() podaną poniżej:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

W powyższej metodzie, gdy dodajesz ciąg do zmiennej „list”:

  • lista.isEmpty() zwróci fałsz.
  • asertFalse(list.isEmpty()) musi zwrócić wartość true.
  • W rezultacie przypadek testowy będzie przechodzić.

Ponieważ dodałeś do listy tylko jeden ciąg znaków, jej rozmiar wynosi jeden.

  • lista.rozmiar() musi zwrócić wartość int „1”.
  • So asertEquals(1, lista.rozmiar()) musi zwrócić wartość true.
  • W rezultacie przypadek testowy będzie przechodzić.
  1. Rozważ metodę m7() podaną poniżej:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Jak omówiono powyżej, @Test(limit czasu = 10) Służy do wymuszenia limitu czasu w przypadku testowym. Wartość jest podana w milisekundach, więc m7() musi zakończyć się w ciągu 10 ms.

  1. Rozważ metodę m8() podaną poniżej:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Jak omówiono powyżej, @Test (oczekiwany) podczas wykonywania będzie sprawdzać, czy występuje określony wyjątek, więc metoda m8() zgłosi wyjątek „No Such Method Exception”. W rezultacie test zostanie wykonany z wyjątkiem.

Uwaga dotycząca dokładności: m8() drukuje tylko linię, więc zadeklarowany wyjątek nigdy nie zostanie faktycznie zgłoszony i JUnit 4 raportuje test jako niepomyślny. Dopasuj oczekiwany typ do tego, co metoda faktycznie zwraca. JUnit 5 pisze to z assertThrows.

Pomyślne wykonanie testu oznacza pomyślne wykonanie wszystkich przypadków testowych.

Aktualny rezultat

Ponieważ w powyższym przykładzie występują trzy przypadki testowe, wszystkie zostaną wykonane jeden po drugim. Zobacz zrzut ekranu konsoli poniżej:

Eclipse wyjście konsoli pokazujące polecenia drukowania @BeforeClass, @Before, @After i @AfterClass
Wyjście konsoli wygenerowane przez JunitAnnotationsExample

Zobacz poniższe instrukcje drukowania, które można zobaczyć na konsoli:

Używanie @BeforeClass , wykonywane przed wszystkimi przypadkami testowymi

Używanie adnotacji @Before, wykonywanych przed każdym przypadkiem testowym

Użycie @After, wykonywane po każdym przypadku testowym

Używanie adnotacji @Before, wykonywanych przed każdym przypadkiem testowym

Używając @Test(timeout), można go użyć do wymuszenia przekroczenia limitu czasu JUnit4 przypadek testowy

Użycie @After, wykonywane po każdym przypadku testowym

Używanie adnotacji @Before, wykonywanych przed każdym przypadkiem testowym

Używając @Test(expected) , podczas wykonywania sprawdzi, czy występuje określony wyjątek

Użycie @After, wykonywane po każdym przypadku testowym

Użycie @AfterClass, wykonywane po wszystkich przypadkach testowych

JUnit Zapewnij klasę

Adnotacje decydują, kiedy metoda zostanie uruchomiona; metody assert decydują, czy zostanie ona zatwierdzona.

Ta klasa udostępnia szereg metod asercji przydatnych przy pisaniu przypadków testowych. Jeśli wszystkie instrukcje assert zostaną zaliczone, wyniki testu będą pomyślne. Jeśli którakolwiek instrukcja assert zakończy się niepowodzeniem, wyniki testu również będą niepomyślne. Dedykowane JUnit zapewniać W tym samouczku każda metoda jest szczegółowo omówiona.

Jak już wcześniej zauważyłeś, poniższa tabela zawiera opis ważnych metod Assert:

S. No. Metoda wykonania OPIS
1. voidasserEquals(oczekiwana wartość logiczna, wartość logiczna rzeczywista) Sprawdza czy dwie wartości są równe, podobnie jak metoda equals klasy Object.
2. void AsserFalse (warunek logiczny) Funkcjonalność polega na sprawdzeniu, czy warunek jest fałszywy.
3. void AsserNotNull (obiekt obiektu) Funkcjonalność „assertNotNull” polega na sprawdzeniu, czy obiekt nie ma wartości null.
4. void AsserNull (obiekt obiektu) Funkcjonalność „assertNull” polega na sprawdzeniu, czy obiekt ma wartość null.
5. void AsserTrue (warunek logiczny) Funkcja „assertTrue” polega na sprawdzeniu, czy warunek jest prawdziwy.
6. pusty błąd() Jeśli chcesz zgłosić błąd potwierdzenia, fail() zawsze spowoduje werdykt niepowodzenia.
7. void AsserSame([Wiadomość tekstowa] Funkcjonalność „assertSame” polega na sprawdzeniu, czy oba obiekty odnoszą się do tego samego obiektu.
8. voidasserNotSame([Wiadomość tekstowa] Funkcjonalność „assertNotSame” polega na sprawdzeniu, czy oba obiekty nie odnoszą się do tego samego obiektu.

JUnit Klasa przypadków testowych

Aby uruchomić wiele testów, dostępna jest klasa TestCase junit.framework pakiet. Adnotacja @Test informuje JUnit że ta publiczna metoda typu void (tutaj przypadek testowy), do której jest dołączona, może zostać uruchomiona jako przypadek testowy.

Uwaga dotycząca wersji: Przypadek testowy, Wynik testu oraz Pakiet testowy należeć do spuścizny junit.framework pakiet od JUnit 3. Nadal są one zawarte w artefakcie junit 4.x, ale testy oparte na adnotacjach nie rozszerzają TestCase.

W poniższej tabeli przedstawiono niektóre ważne metody dostępne w junit.framework.TestCase klasa:

S. No. Metoda wykonania OPIS
1. int liczbaPrzypadków Testowych() Ta metoda służy do zliczania liczby przypadków testowych wykonywanych przez uruchom(TestResult tr) Metoda.
2. Wynik testu utwórzResult() Ta metoda służy do tworzenia Wynik testu obiekt.
3. Ciąg getName () Ta metoda zwraca ciąg znaków, który jest niczym innym jak a Przypadek testowy nazwa.
4. Uruchomienie wyniku testu() Ta metoda służy do wykonania testu, który zwraca Wynik testu obiekt.
5. nieważny przebieg (wynik TestResult) Ta metoda służy do wykonania testu mającego Wynik testu obiekt, który nic nie zwraca.
6. void setName (nazwa ciągu) Ta metoda służy do ustawienia nazwy Przypadek testowy.
7. unieważnij konfigurację() Metodę tę stosuje się do pisania kodu skojarzeń zasobów, na przykład do tworzenia połączenia z bazą danych.
8. puste rozdarcie() Metodę tę stosuje się do pisania kodu zwalniającego zasoby, na przykład zwalniającego połączenie z bazą danych po wykonaniu operacji transakcyjnej.

JUnit Klasa TestResult

Po wykonaniu testu zwracany jest wynik (w formie Wynik testu Obiekt TestResult może być użyty do analizy obiektu wynikowego. Wynik testu może być pozytywny lub negatywny.

W poniższej tabeli znajdziesz ważne metody używane w klasie junit.framework.TestResult:

S. No. Metoda wykonania OPIS
1. void addError (test testowy, t rzucalny) Tę metodę należy stosować, jeśli trzeba dodać błąd do testu.
2. void addFailure(Test testowy, AssertionFailedError t) Tę metodę należy stosować, gdy trzeba dodać awarię do listy awarii.
3. void endTest (test testowy) Metodę tę stosuje się w celu powiadomienia o wykonaniu (zakończeniu) testu.
4. int liczba błędów() Metodę tę stosuje się w celu uzyskania informacji o błędach wykrytych podczas wykonywania testu.
5. Wyliczenie błędy() Ta metoda po prostu zwraca kolekcję (w tym przypadku Enumeration) błędów.
6. int liczba niepowodzeń() Metodę tę stosuje się w celu uzyskania liczby błędów wykrytych podczas wykonywania testu.
7. nieważne uruchomienie (test TestCase) Ta metoda służy do wykonania przypadku testowego.
8. int runCount() Ta metoda po prostu zlicza wykonane testy.
9. void startTest (test testowy) Ta metoda służy do powiadamiania o rozpoczęciu testu.
10. pusty przystanek() Metodę tę stosuje się w celu zatrzymania przebiegu testu.

JUnit Klasa pakietu testowego

Jeśli chcesz wykonać wiele testów w określonej kolejności, możesz to zrobić, łącząc wszystkie testy w jednym miejscu. To miejsce nazywa się zestawem testów, a JUnit zestaw testowy samouczek przeprowadza przez cały przykład.

W poniższej tabeli przedstawiono ważne metody stosowane w junit.framework.TestSuite klasa:

S. No. Metoda wykonania OPIS
1. void addTest(Test testowy) Metodę tę stosuje się, jeśli chcesz dodać test do pakietu.
2. void addTestSuite (Class klasa testowa) Tej metody używa się, jeśli chcesz określić klasę podczas dodawania testu do zestawu.
3. int liczbaPrzypadków Testowych() Metodę tę stosuje się, jeśli chcesz policzyć liczbę przypadków testowych.
4. Ciąg getName () Ta metoda służy do uzyskania nazwy zestawu testów.
5. nieważny przebieg (wynik TestResult) Metodę tę stosuje się do wykonania testu i zebrania wyników testu w Wynik testu obiekt.
6. void setName (nazwa ciągu) Ta metoda służy do ustawienia nazwy Pakiet testowy.
7. Test testAt(indeks int) Tę metodę należy stosować, gdy chcemy zwrócić test pod określonym indeksem.
8. int testCount() Tę metodę należy stosować, gdy chcemy zwrócić liczbę testów w zestawie.
9. statyczne ostrzeżenie dotyczące testu (komunikat tekstowy) Ta metoda zwraca test, który zakończy się niepowodzeniem i zarejestruje komunikat ostrzegawczy.

FAQ

Tak. Metoda zazwyczaj zawiera adnotację @Test razem z adnotacją @Ignore lub @Test z limitem czasu i oczekiwanym wyjątkiem. Nie można łączyć dwóch adnotacji cyklu życia, takich jak @Before i @After, w jednej metodzie.

@Ignore tylko blokuje metodę JUnit jest już rozpoznawany jako test. Bez @Test obok niego, runner nigdy nie zbiera metody, więc nie jest ona ani uruchamiana, ani oznaczana jako pominięta.

JUnit Uruchamia metodę w oddzielnym wątku i kończy ją niepowodzeniem z wyjątkiem TestTimedOutException po upływie budżetu. Wątek zostaje przerwany, a nie zamknięty, więc wywołanie blokujące może być nadal wykonywane.

Tylko przez silnik vintage. Dodanie junit-vintage-engine pozwala JUnit Platforma uruchamia istniejące testy org.junit bez zmian, ale testy Jupitera muszą importować org.junit.jupiter.api. Połączenie obu zestawów importów w jednej klasie kończy się niepowodzeniem.

Tylko do celów konserwacyjnych. Starsze pakiety rozszerzające TestCase i budujące obiekty TestSuite są nadal powszechne w starszych bazach kodu, więc rozpoznanie API jest pomocne. Nowe testy powinny być oparte na adnotacjach.

JUnit buduje nową instancję klasy testowej dla każdej metody testowej, więc żadna nie istnieje, gdy konieczne jest uruchomienie konfiguracji na poziomie klasy. Metoda statyczna nie wymaga instancji, a JUnit odrzuca deklarację niestatyczną.

Asystenci AI odczytują testowaną metodę i sugerują, czy konfiguracja należy do @Before, czy do @BeforeClass, a także czy ścieżka błędu wymaga @Test(expected) lub assertThrows. Traktuj każdą sugestię jako wersję roboczą.

Drugi pilot GitHub zwykle prawidłowo umieszcza montaż i demontaż, ale często miesza JUnit 4 i importy Jupitera w jednym pliku. Sprawdź blok importu przed uruchomieniem pakietu.

Podsumuj ten post następująco: