Stwórz JUnit Zestaw testowy z przykładem: @RunWith @SuiteClasses

⚡ Inteligentne podsumowanie

JUnit Zestawy testów agregują przypadki testowe z kilku klas, tak aby były uruchamiane razem w jednym przebiegu, sterowane adnotacjami @RunWith(Suite.class) i @SuiteClasses i uruchamiane za pośrednictwem zwykłej klasy uruchamiającej testy.

  • 🔘 Cel: Grupuj testy z wielu klas w jedną, możliwą do uruchomienia jednostkę zamiast uruchamiać każdą klasę testów osobno.
  • Adnotacje: @RunWith(Suite.class) deleguje wykonywanie, podczas gdy @SuiteClasses wyświetla wszystkie klasy, które muszą zostać uruchomione w pakiecie.
  • Kroki: Napisz klasy testowe, dodaj klasę uchwytu zawierającą obie adnotacje, a następnie uruchom ją z JUnitGłówny biegacz.
  • 🧪 Przykład: JunitTest.java grupuje SuiteTest1 i SuiteTest2, a konsola raportuje trzy zaliczone testy.
  • 🛠️. JUnit 5: Jupiter zastępuje moduł uruchamiający @Suite plus @SelectClasses lub @SelectPackages na platformie Suite Engine.
  • 📌 Pułapki: Najczęstszą przyczyną błędów są puste pakiety, brakujące importy i klasa pakietu zawierająca własne metody @Test.

Tworząc JUnit zestaw testów z adnotacjami @RunWith i @SuiteClasses

In JUnitzestaw testów pozwala nam na agregację wszystkich przypadki testowe z wielu klas w jednym miejscu i prowadzić je razem.

Aby uruchomić test pakietu, należy dodać adnotacje do klasy, korzystając z poniższych adnotacji:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) lub @Suite.SuiteClasses({test1.class, test2.class…})

Dzięki powyższym adnotacjom wszystkie klasy testowe w pakiecie zaczną być wykonywane po kolei. Sama klasa pakietu pozostaje pusta: jest jedynie miejscem przechowywania adnotacji, a program uruchamiający odczytuje te adnotacje, aby zdecydować, co wykonać.

Kroki tworzenia zestawu testów i modułu uruchamiającego testy

Cztery poniższe kroki tworzą najmniejszy zestaw, który faktycznie działa: dwie zwykłe klasy testowe, klasa zestawu nadająca im nazwy oraz moduł uruchamiający, który uruchamia zestaw z metody głównej.

Krok 1) Utwórz prostą klasę testową (np. MyFirstClassTest) i dodaj metodę z adnotacją @Test.

Pierwsza klasa zawiera pojedynczą pustą metodę testową, co wystarcza, aby udowodnić, że pakiet ją wykryje:

Klasa MyFirstClassTest w Eclipse deklarowanie adnotacji @Test myFirstMethod

Krok 2) Utwórz inną klasę testową do dodania (np. MySecondClassTest) i utwórz metodę z adnotacją @Test.

Druga klasa ma dokładnie taki sam kształt, więc zestaw składa się z dwóch oddzielnych klas do agregacji:

Klasa MySecondClassTest w Eclipse deklarowanie adnotacji @Test mySecondMethod

Krok 3) Aby utworzyć zestaw testów, należy najpierw dodać do klasy adnotacje @RunWith(Suite.class) i @SuiteClasses(class1.class, class2.class…).

Należy zauważyć, że klasa zestawu TestSuiteExample nie deklaruje żadnej własnej metody testowej — wszystkie informacje znajdują się w dwóch adnotacjach:

Przykład TestSuiteExample z adnotacjami @RunWith(Suite.class) i @SuiteClasses, nadając nazwy MyFirstClassTest i MySecondClassTest

Krok 4) Utwórz klasę Test Runner, aby uruchomić nasz zestaw testów, jak pokazano poniżej:

Biegacz jest prosty Java klasa z metodą główną, która przekazuje klasę pakietu do JUnitCore:

Wywołanie klasy Test Runner JUnitCore.runClasses w TestSuiteExample i drukowanie listy błędów

Code Wyjaśnienie:

  • Code Linia 8: Deklarowanie głównej metody klasy Test, która będzie uruchamiać nasze JUnit test.
  • Code Linia 9: Wykonywanie przypadków testowych przy użyciu JUnitCore.runClasses przyjmuje nazwę klasy testowej jako parametr (w powyższym przykładzie używasz TestSuiteExample.class pokazanego w kroku 3).
  • Code Linia 11: Przetwarzanie wyniku za pomocą pętli for i drukowanie błędnego wyniku.
  • Code Linia 13: Drukowanie pomyślnego wyniku.

Wyjście: Oto wynik pokazujący pomyślny test bez błędów trace jak podano poniżej:

Eclipse JUnit Wyświetl raport Uruchomiono 2/2 z zerową liczbą błędów i zerową liczbą awarii dla TestSuiteExample

Zielony pasek potwierdza, do czego służy pakiet: jedno uruchomienie, jeden widok wyników i obie klasy raportowane pod węzłem pakietu, a nie w dwóch oddzielnych uruchomieniach.

JUnit Przykład zestawu testowego

Rozważmy bardziej złożony przykład, w którym klasy wewnątrz pakietu faktycznie zapewniać coś zamiast trzymać pustą metodę.

JunitTest.java

JunitTest.java to prosta klasa z adnotacją @Biegnij z oraz @Zestaw Adnotacje. Możesz podać dowolną liczbę klas w zestawie jako parametry, jak podano poniżej:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java to klasa testowa zawierająca metody testowe, które drukują komunikat, jak pokazano poniżej. Będziesz używać tej klasy jako elementu zestawu w klasie wymienionej powyżej. Opiera się ona na klasie pomocniczej o nazwie JUnitWiadomość zdefiniowana w innym miejscu tego samego pakietu i nieobecna w tym miejscu.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java jest inną klasą testową, podobną do SuiteTest1.java, posiadając metodę testową do drukowania wiadomości, jak podano poniżej. Będziesz używać tej klasy jako członka zestawu w JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Wydajność

Po wykonaniu Test Junit.java, która zawiera pakiet zawierający SuiteTest1.java oraz SuiteTest2.java, otrzymasz poniższy wynik. Konsola wyświetla komunikaty wygenerowane przez obie klasy:

Eclipse Konsola wyświetlająca wydrukowane wiadomości z obu klas pakietu po zakończeniu testu JunitTest

JUnit wyświetl rekordy tego samego przebiegu jako trzy zaliczone metody testowe zgrupowane w klasie pakietu:

Eclipse JUnit zobacz raportowanie 3/3 zielonych wyników dla JunitTest z rozszerzonymi SuiteTest1 i SuiteTest2

Uwaga: Etykiety konsoli w tym przykładzie są skrzyżowane — ciąg wydrukowany przez SuiteTest1 to „Test Suite 2”, a ten wydrukowany przez SuiteTest2 to „Test Suite 1”. Oryginalne listy są odtwarzane bez zmian, więc etykiety pozostają takie, jakie nadał im autor; odczytaj nazwę klasy w JUnit zamiast drukowanej etykiety, gdy dopasowujesz dane wyjściowe do źródła.

Jak utworzyć zestaw testów w JUnit 5

JUnit Wersja 5 całkowicie usuwa runnery, więc @RunWith(Suite.class) nie istnieje w pakietach org.junit.jupiter. Pakiety zostały przeniesione do JUnit Platforma, która wysyła je w osobnym artefakcie o nazwie Silnik pakietu junit-platform-suiteDodaj tę zależność, a następnie dodaj adnotację @Suite do klasy i jedną z adnotacji selektora.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Adnotacje selektora zastępują pojedynczą listę @SuiteClasses małą rodziną opcji:

Adnotacja Co wybiera
@SelectClasses Poszczególne klasy testowe nazywane są jedna po drugiej, stanowią bezpośredni zamiennik @SuiteClasses.
@SelectPackages Każda klasa testowa w pakiecie o podanej nazwie i we wszystkich jego podpakietach.
@IncludeClassNamePatterns Filtr wyrażenia regularnego zastosowany do zaznaczenia.
@SuiteDisplayName Czytelna nazwa wyświetlana w raporcie zamiast nazwy klasy.

W praktyce istotne są jeszcze dwie różnice. JUnit Klasa pakietu 5 może deklarować metody @BeforeSuite i @AfterSuite, które są uruchamiane jednokrotnie w całym pakiecie, a JUnit Przykład 4 powyżej nadal działa na JUnit Platforma korzysta z klasycznego silnika, więc nie ma potrzeby przepisywania oryginalnego kodu na tej stronie, aby nadal działał.

Zalety i ograniczenia JUnit Zestawy testowe

Apartament to grupaping mechanizm, a nie ramy testowe samo w sobie, co wpływa zarówno na to, co robi dobrze, jak i na to, kiedy przestaje być przydatne.

Zalety

  • Jedno uruchomienie uruchamia powiązane klasy, więc zestaw dymny lub regresja zestaw uruchamia się za pomocą jednego polecenia.
  • Widok wyników grupuje wszystkie klasy w ramach jednego węzła pakietu, co ułatwia wykrycie wspólnej awarii.
  • Lista członków jest zapisana w kodzie, dlatego podlega przeglądowi i kontroli wersji tak jak każdy inny plik źródłowy.
  • Tę samą klasę pakietu można uruchomić z poziomu IDE, z poziomu programu uruchamiającego, takiego jak JUnitRdzeń lub narzędzie do kompilacji.

Ograniczenia

  • @SuiteClasses to zakodowana na stałe lista, więc nowa klasa testowa jest automatycznie pomijana, dopóki ktoś nie edytuje zestawu.
  • Zestaw nie daje żadnej gwarancji kolejności wykraczającej poza kolejność, w jakiej klasy są wymienione.
  • Żadne elementy nie są współdzielone pomiędzy klasami członkowskimi, więc zestaw nie zastępuje klasy bazowej ani klasy osprzętu.
  • Narzędzia do kompilacji już wykrywają klasy testowe na podstawie konwencji nazewnictwa, co sprawia, że ​​zestaw narzędzi jest zbędny w wielu projektach.

Typowe błędy podczas tworzenia JUnit Pakiet testowy

Większość problemów z pakietem generuje krótką, nieprzydatną wiadomość. Tabela przedstawia przykładowe komunikaty, z którymi możesz się spotkać, wraz z ich przyczyną i rozwiązaniem.

Wiadomość lub objaw Spowodować Fix
initializationError: Brak metod możliwych do uruchomienia Klasa jest uruchamiana jako zwykła klasa testowa, ale zawiera tylko adnotacje. Dodaj @RunWith(Suite.class), aby zamiast domyślnego programu uruchamiającego funkcję, funkcję tę przejął program uruchamiający pakiet.
nie można znaleźć symbolu: klasa Suite Brak importu pakietu. Importuj org.junit.runners.Suite obok org.junit.runner.RunWith.
Apartament działa, ale jedna klasa jest pomijana Klasa nigdy nie została dodana do listy @SuiteClasses. Dodaj klasę jawnie lub przenieś ją do @SelectPackages w JUnit 5.
Kompilator nie akceptuje nazwy klasy @Runwith lub @suiteClasses zostało napisane z niewłaściwą wielkością liter. Java adnotacje uwzględniają wielkość liter: @RunWith i @SuiteClasses pisz dokładnie.
Testy w samej klasie pakietu nigdy nie są uruchamiane Do uchwytu pakietu dodano metodę @Test. Pozostaw uchwyt pusty i przenieś metodę testową do klasy członkowskiej.

Napisanie zestawu raz i trzymanie się goping To jest prawdziwa praca. Jeśli lista odbiega od klas na dysku, pakiet wyświetla kolor zielony, podczas gdy część test jednostkowy zestaw nigdy się nie wykonuje, jest to jeden z najcichszych trybów awarii w Testowanie oprogramowania.

FAQ

Pakiet wykonuje klasy w kolejności, w jakiej są wymienione, ale JUnit Nie daje gwarancji co do kolejności metod w każdej klasie. Testy zależne od wcześniejszego uruchomienia testu są niestabilne i należy je przepisać, aby działały niezależnie.

Tak. Klasa pakietu jest zwykłą klasą z punktu widzenia osoby uruchamiającej program, więc nazwanie jej wewnątrz innej listy @SuiteClasses powoduje zagnieżdżenie pakietów. Zagnieżdżanie jest przydatne w przypadku pakietu regresji najwyższego poziomu zbudowanego z mniejszych pakietów modułów.

Asystenci AI odczytują klasy testowe z dysku, porównują je z listą @SuiteClasses i oznaczają klasy, które nigdy nie zostały dodane. Grupują również powtarzające się błędy. tracwedług przyczyny źródłowej, co skraca etap wstępnej selekcji po tym, jak apartament zgłosi wiele czerwonych kart na raz.

Drugi pilot szybko zapisuje parę adnotacji, ale często miesza JUnit 4 i JUnit 5 importów w tym samym pliku. Sprawdź, czy org.junit.runners.Suite i org.junit.platform.suite.api.Suite nigdy nie występują razem, ponieważ tylko jeden z nich pasuje do Twojego runnera.

Dodaj junit-platform-suite-engine do zakresu testów. Adnotacje @Suite i @SelectClasses znajdują się w junit-platform-suite-api, które artefakt silnika pobiera przechodnio, więc zazwyczaj wystarczy pojedyncza zależność.

Zwykle nie. Surefire i Gradle Zadanie testowe już wykrywa klasy testowe poprzez nadanie wzorca nazwy i uruchamia je wszystkie. Warto napisać zestaw, gdy potrzebujesz nazwanego podzbioru, takiego jak zestaw dymny, który jest mniejszy niż pełny przebieg.

Program uruchamiający zgłasza błąd inicjalizacji dla tego elementu, informując, że nie znaleziono żadnych metod możliwych do uruchomienia, a cały zestaw jest oznaczony jako niepowodzenie. Usuń wpis lub dodaj metodę @Test do klasy.

Nie w obrębie jednej listy selektorów. Zachowaj JUnit 4 klasy na zabytkowym silniku i wybierz je z JUnit 5 pakietów na pakiet, więc oba silniki działają w tym samym systemie JUnit Uruchomienie platformy bez mieszania rodzin adnotacji.

Podsumuj ten post następująco: