Eine gut geschriebene Testsuite enthält mehrere Tests für eine bestimmte Funktion. Indem Sie verwandte Merkmale gruppieren, können Sie die Beziehung zwischen mehreren Testgruppen ausdrücken. Einer der Hauptvorteile der Gruppierung von Komponententestklassen besteht darin, dass Sie die Menge an Testcode reduzieren können, die Sie schreiben, da gruppierte Tests Ressourcen gemeinsam nutzen.

Mit JUnit 5 können Sie verschachtelte Tests mit der Annotation @Nested erstellen. In diesem Artikel erfahren Sie, was die Annotation @Nested ist und wie Sie sie verwenden.

Was ist ein verschachtelter Test?

Die Annotation @Nested von JUnit signalisiert, dass die Klasse, mit der sie verknüpft ist, eine innere Klasse ist, die Mitglied einer anderen Klasse ist. Ein verschachtelter Test ist eine Testklasse, die die Annotation @Nested enthält, da dies bedeutet, dass es eine (oder mehrere) innere Klasse innerhalb einer Testklasse der obersten Ebene gibt. Eine verschachtelte Klasse kann innerhalb einer Klasse der obersten Ebene oder innerhalb einer ebenfalls verschachtelten Klasse erscheinen.

instagram viewer

Erstellen von Java-Klassen zum Testen

Eine verschachtelte Testklasse erbt alle Features ihrer Elternklasse. Daher ist der beste Zeitpunkt zum Erstellen eines verschachtelten Tests, wenn es eine logische Gruppierung von Testfällen gibt oder wenn ein einzelner Testfall unterschiedliche Merkmale aufweist. Ein gutes Beispiel hierfür ist, wenn Sie die Fähigkeit einer Klasse testen möchten, nützliche Objekte zu erstellen. Ein weiteres Beispiel ist, wenn eine einzelne Methode zwei oder mehr Zwecke hat.

Hier ist eine Beispielklasse, die Sie in einer Einzelhandelsanwendung verwenden können, die zeigt, wie Sie einen verschachtelten Test erstellen können.

öffentlichKlasseKunde{
geschütztint Kundennummer;
geschützt Zeichenfolge Kundenname;
geschützt Zeichenfolge Kundencode;

// Standardkonstruktor
öffentlichKunde(){
Das.Kunden-ID = 0;
Das.Kundenname = "";
Das.Kundencode ="";
}

// primärer Konstruktor
öffentlichKunde(int Kunden-ID, Zeichenfolge Kundenname, Zeichenfolge Kundencode){
Das.KundenID = KundenID;
Das.Kundenname = Kundenname;
Das.Kundencode = Kundencode;
}

// Konstruktor kopieren
öffentlichKunde(Kunde Kunde){
Das.customerId = kunde.kundenId;
Das.kundenname = kunde.kundenname;
Das.Kundencode = Kunde.Kundencode;
}

// Getter und Setter
öffentlichintgetCustomerId(){
zurückkehren Kundennummer;
}

öffentlichLeeresetCustomerId(int Kundennummer){
Das.KundenID = KundenID;
}

öffentlich Schnur getCustomerName(){
zurückkehren Kundenname;
}

öffentlichLeeresetCustomerName(Zeichenfolge Kundenname){
Das.Kundenname = Kundenname;
}

öffentlich Schnur Kundencode abrufen(){
zurückkehren Kundennummer;
}

öffentlichLeeresetCustomerCode(String Kundencode){
Das.Kundencode = Kundencode;
}

// Ermitteln Sie einen Kundenrabattprozentsatz basierend auf dem Kundentyp
öffentlichdoppeltKundentyp(String Kundencode){
doppelt Rabatt = 0;

Wenn (customerCode.toLowerCase().equals("pre")) {
Rabatt = 0.10;
} andersWenn (customerCode.toLowerCase().equals("gen")) {
Rabatt = 0.02;
} andersWenn (Kundencode.toLowerCase().equals("neu")) {
Rabatt = 0.05;
}

zurückkehren Rabatt;
}

// GrandTotal eines Kunden basierend auf dem Kundentyp bestimmen
öffentlichdoppeltGesamtsumme(doppelt gesamt){
doppelt Rabatt = Kundentyp (Kundencode);
doppelt RabattProzent = Gesamt * Rabatt;
doppelt finalTotal = total - discountPercentage;
zurückkehren finalTotal;
}
}

Diese Customer-Klasse enthält alle Komponenten einer Java-Klasse, komplett mit zwei Methoden.

Erstellen eines verschachtelten Tests mit JUnit 5

Die Customer-Klasse hat mehrere Konstruktoren, Getter und Setter sowie zwei Methoden. Sie können eine verschachtelte Klasse (innerhalb der Customer-Testklasse) erstellen, die ein neues Customer-Objekt erstellt und alle seine Komponenten testet.

importierenstatischorg.junit.Jupiter.api.Behauptungen.*;

importierenorg.junit.Jupiter.api.Anzeigename;
importierenorg.junit.Jupiter.api.Verschachtelt;
importierenorg.junit.Jupiter.api.Prüfen;

@DisplayName("Kundentestkurs zeigt, wie es geht ErstellenVerschachtelt Tests.")
KlasseKundenTest{
geschütztint KundenID = 301;
geschützte Zeichenfolge Kundenname = "Mike Wilson";
geschützter String Kundencode = "Vor";
geschütztdoppelt insgesamt = 600;

@Verschachtelt
@Anzeigename("Verschachtelte Customer Builder-Testklasse innerhalb einer Testklasse der obersten Ebene")
KlasseCustomerBuilderTest{
Kunde Kunde = neu Kunde (Kunden-ID, Kundenname, Kundencode);
doppelt grandTotal = customer.grandTotal (gesamt);

@Prüfen
@Anzeigename("Testen des Kunden's Klassenkonstruktoren, Getter und Setter und Methoden.")
LeereKundeBuilder(){
assertAll(() -> {
behauptenGleich(Kundennummer, Kunde.getCustomerId());
behauptenGleich(Kundenname, Kunde.getKundenname());
behauptenGleich(Kundennummer, Kunde.getCustomerCode());
behauptenGleich(0.10, Kunde.Kundentyp(Kundennummer));
assertEquals (540, grandTotal);
});
}
}
}

Die CustomerTest-Klasse ist die oberste Testklasse einer verschachtelten CustomerBuilderTest-Klasse. CustomerBuilderTest erstellt ein neues Customer-Objekt und testet seine Komponenten mit Behauptungstests.

Das Ausführen der Testklasse CustomerTest führt zu den folgenden erfolgreichen Testergebnissen:

Die Namen der Testklassen und der Testmethode sind aussagekräftig und verständlich, dank der @DisplayName-Anmerkung.

Zu wissen, wie man Software testet, ist entscheidend

Technologie ist für die meisten Menschen ein wichtiger Aspekt des täglichen Lebens. Der Einsatz für die Entwicklung von Software, die genau das tut, was sie tun soll, war noch nie so hoch.

Ein selbstfahrendes Auto, das seine Nähe zu einem anderen Objekt falsch einschätzt, kann einen schweren Unfall verursachen. Daher müssen Sie Ihre Anwendung in jeder Phase ihrer Entwicklung testen.