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.
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:
- 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ć.
- 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.
- 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:

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. |
