Dobrze napisany zestaw testów będzie zawierał kilka testów dla określonej funkcji. Grupując powiązane funkcje, można wyrazić związek między kilkoma grupami testów. Jedną z głównych zalet grupowania klas testów jednostkowych jest to, że może to zmniejszyć ilość kodu testowego, który piszesz, ponieważ zgrupowane testy współdzielą zasoby.
JUnit 5 umożliwia tworzenie testów zagnieżdżonych przy użyciu adnotacji @Nested. Z tego artykułu dowiesz się, czym jest adnotacja @Nested i jak z niej korzystać.
Co to jest test zagnieżdżony?
Adnotacja @Nested JUnit sygnalizuje, że klasa, z którą jest powiązana, jest klasą wewnętrzną, która jest członkiem innej klasy. Test zagnieżdżony to klasa testowa zawierająca adnotację @Nested, ponieważ oznacza to, że w klasie testowej najwyższego poziomu istnieje jedna (lub więcej) klasa wewnętrzna. Klasa zagnieżdżona może pojawić się w klasie najwyższego poziomu lub w klasie, która jest również zagnieżdżona.
Tworzenie klas Java do testowania
Zagnieżdżona klasa testowa dziedziczy wszystkie cechy swojej klasy nadrzędnej. Dlatego najlepszym momentem na utworzenie testu zagnieżdżonego jest sytuacja, gdy istnieje logiczne pogrupowanie przypadków testowych lub gdy pojedynczy przypadek testowy ma różne cechy. Dobrym tego przykładem jest sytuacja, gdy chcesz przetestować zdolność klasy do tworzenia użytecznych obiektów. Innym przykładem jest sytuacja, gdy pojedyncza metoda ma dwa lub więcej celów.
Oto przykładowa klasa, której możesz użyć w aplikacji detalicznej, która pokazuje, jak możesz utworzyć test zagnieżdżony.
publicznyklasaKlient{
chronionyint Identyfikator klienta;
chroniony Ciąg nazwa_klienta;
chroniony Ciąg kod klienta;// domyślny konstruktor
publicznyKlient(){
Ten.identyfikator klienta = 0;
Tennazwa_klienta = "";
Ten.Kod klienta ="";
}// główny konstruktor
publicznyKlient(int identyfikator klienta, ciąg nazwa_klienta, ciąg kod_klienta){
Ten.identyfikator klienta = identyfikator klienta;
Ten.nazwaklienta = nazwaklienta;
Ten.KodKlienta =KodKlienta;
}// kopiowanie konstruktora
publicznyKlient(Klient klient){
Ten.customerId = klient.customerId;
Ten.nazwaklienta = klient.nazwaklienta;
Ten.KodKlienta =Klient.KodKlienta;
}// pobierające i ustawiające
publicznyintpobierz identyfikator klienta(){
powrót Identyfikator klienta;
}publicznypróżniaustaw identyfikator klienta(int Identyfikator klienta){
Ten.identyfikator klienta = identyfikator klienta;
}publiczny Strunowy pobierzNazwęKlienta(){
powrót nazwa klienta;
}publicznypróżniaustawNazwaKlienta(Ciąg nazwa_klienta){
Ten.nazwaklienta = nazwaklienta;
}publiczny Strunowy pobierzKodKlienta(){
powrót kod klienta;
}publicznypróżniaustawKodKlienta(Ciąg znaków klienta){
Ten.KodKlienta =KodKlienta;
}// określ procent rabatu dla klienta na podstawie typu klienta
publicznypodwójnietyp klienta(Ciąg znaków klienta){
podwójnie zniżka = 0;Jeśli (customerCode.toLowerCase().equals("pre")) {
zniżka = 0.10;
} w przeciwnym razieJeśli (customerCode.toLowerCase().equals("gen")) {
zniżka = 0.02;
} w przeciwnym razieJeśli (customerCode.toLowerCase().equals("nowy")) {
zniżka = 0.05;
}powrót rabat;
}
// określ całkowitą sumę klienta na podstawie typu klienta
publicznypodwójnieŁączna suma(podwójnie całkowity){
podwójnie rabat = typ klienta (kod klienta);
podwójnie zniżkaProcent = suma * zniżka;
podwójnie finalTotal = razem - rabatProcent;
powrót ostateczna Suma;
}
}
Ta klasa Customer zawiera wszystkie komponenty klasy Java wraz z dwiema metodami.
Tworzenie testu zagnieżdżonego za pomocą JUnit 5
Klasa Customer ma kilka konstruktorów, getterów i setterów oraz dwie metody. Możesz utworzyć klasę zagnieżdżoną (w ramach klasy testowej Customer), która tworzy nowy obiekt Customer i testuje wszystkie jego komponenty.
importstatycznyorg.junit.Jowisz.api.Twierdzenia.*;
importorg.junit.Jowisz.api.Wyświetlana nazwa;
importorg.junit.Jowisz.api.Zagnieżdżone;
importorg.junit.Jowisz.api.Test;@DisplayName("Klasa testu klienta pokazująca, jak to zrobić TworzyćZagnieżdżone Testy.")
klasaTest klienta{
chronionyint identyfikator klienta = 301;
chroniony ciąg nazwa_klienta = "Mike'a Wilsona";
chroniony ciąg kod klienta = "Przed";
chronionypodwójnie ogółem = 600;@Zagnieżdżone
@Wyświetlana nazwa("Zagnieżdżona klasa testowa konstruktora klienta w klasie testowej najwyższego poziomu")
klasaCustomerBuilderTest{
klient klient = nowy Klient (identyfikator klienta, nazwa klienta, kod klienta);
podwójnie grandTotal = klient.grandTotal (ogółem);
@Test
@Wyświetlana nazwa("Testowanie Klienta's Konstruktory klas, metody pobierające i ustawiające oraz metody.")
próżniaKonstruktor klienta(){
asertWszystko(() -> {
twierdząRówna się(Identyfikator klienta, klient.getCustomerId());
twierdząRówna się(nazwa klienta, klient.pobierz nazwę klienta());
twierdząRówna się(kod klienta, klient.pobierzKodKlienta());
twierdząRówna się(0.10, klient.typ klienta(kod klienta));
assertEquals (540, suma całkowita);
});
}
}
}
Klasa CustomerTest jest klasą testową najwyższego poziomu dla zagnieżdżonej klasy CustomerBuilderTest. CustomerBuilderTest tworzy nowy obiekt klienta i testuje jego komponenty za pomocą testy asercji.
Wykonanie klasy testowej CustomerTest daje następujące pomyślne wyniki testu:
Nazwy klas testowych i metoda testowa są opisowe i wyczerpujące, dzięki Adnotacja @DisplayName.
Wiedza o tym, jak testować oprogramowanie, jest kluczowa
Technologia jest ważnym aspektem codziennego życia większości ludzi. Stawka tworzenia oprogramowania, które robi dokładnie to, co ma robić, nigdy nie była wyższa.
Autonomiczny samochód, który błędnie oblicza odległość od innego obiektu, może spowodować poważny wypadek. Dlatego musisz testować swoją aplikację na każdym etapie jej rozwoju.