Une suite de tests bien écrite aura plusieurs tests pour une fonctionnalité spécifique. En regroupant des fonctionnalités liées, vous pouvez exprimer la relation entre plusieurs groupes de tests. L'un des principaux avantages du regroupement des classes de tests unitaires est qu'il peut réduire la quantité de code de test que vous écrivez, car les tests groupés partagent les ressources.

JUnit 5 vous permet de créer des tests imbriqués à l'aide de l'annotation @Nested. Dans cet article, vous apprendrez ce qu'est l'annotation @Nested et comment l'utiliser.

Qu'est-ce qu'un test imbriqué ?

L'annotation @Nested de JUnit signale que la classe à laquelle elle est associée est une classe interne, qui est membre d'une autre classe. Un test imbriqué est une classe de test qui contient l'annotation @Nested, car cela signifie qu'il existe une (ou plusieurs) classe interne dans une classe de test de niveau supérieur. Une classe imbriquée peut apparaître dans une classe de niveau supérieur ou dans une classe également imbriquée.

Création de classes Java à tester

Une classe de test imbriquée hérite de toutes les fonctionnalités de sa classe parent. Par conséquent, le meilleur moment pour créer un test imbriqué est lorsqu'il existe un regroupement logique de cas de test ou lorsqu'un seul cas de test a des fonctionnalités différentes. Un bon exemple de ceci est lorsque vous voulez tester la capacité d'une classe à créer des objets utiles. Un autre exemple est lorsqu'une seule méthode a deux objectifs ou plus.

Voici un exemple de classe que vous pouvez utiliser dans une application de vente au détail, qui montre comment vous pouvez créer un test imbriqué.

publicclasseClient{
protégéentier N ° de client;
protégé Chaîne nom_client ;
protégé Chaîne customerCode ;

// constructeur par défaut
publicClient(){
ce.idclient = 0;
ce.nomclient = "" ;
ce.codeclient="" ;
}

// constructeur principal
publicClient(entier ID client, chaîne nom_client, chaîne code_client){
ce.customerId = customerId ;
ce.customerName = clientName ;
ce.codeclient = codeclient ;
}

// copie le constructeur
publicClient(client client){
ce.customerId = client.customerId ;
ce.customerName = client.customerName ;
ce.customerCode = client.customerCode ;
}

// getters et setters
publicentiergetCustomerId(){
retour N ° de client;
}

publicannulersetCustomerId(entier N ° de client){
ce.customerId = customerId ;
}

public Chaîne getCustomerName(){
retour NomClient ;
}

publicannulersetNomClient(Chaîne nom_client){
ce.customerName = clientName ;
}

public Chaîne getCustomerCode(){
retour code client;
}

publicannulersetCustomerCode(Chaîne code client){
ce.codeclient = codeclient ;
}

// détermine un pourcentage de remise client en fonction du type de client
publicdoubleType de client(Chaîne code client){
double remise = 0;

si (customerCode.toLowerCase().equals("pre")) {
remise = 0.10;
} autresi (customerCode.toLowerCase().equals("gen")) {
remise = 0.02;
} autresi (customerCode.toLowerCase().equals("nouveau")) {
remise = 0.05;
}

retour rabais;
}

// détermine le grandTotal d'un client en fonction du type de client
publicdoubletotal(double total){
double remise = typeclient (codeclient);
double remisePourcentage = total * remise ;
double total final = total - pourcentage de remise ;
retour total final ;
}
}

Cette classe Customer contient tous les composants d'une classe Java, avec deux méthodes.

Création d'un test imbriqué avec JUnit 5

La classe Customer a plusieurs constructeurs, getters et setters, et deux méthodes. Vous pouvez créer une classe imbriquée (dans la classe de test Customer) qui crée un nouvel objet Customer et teste tous ses composants.

importerstatiqueorg.junit.Jupiter.api.Assertions.*;

importerorg.junit.Jupiter.api.Afficher un nom;
importerorg.junit.Jupiter.api.Imbriqué;
importerorg.junit.Jupiter.api.Test;

@DisplayName("Classe de test client montrant comment CréerImbriqué Essais.")
classeClientTest{
protégéentier ID client = 301;
chaîne protégée nom_client = "Mike Wilson";
chaîne protégée codeclient = "Pré";
protégédouble somme = 600;

@Imbriqué
@Afficher un nom("Classe de test imbriquée de Customer Builder dans une classe de test de niveau supérieur")
classeCustomerBuilderTest{
Client client = nouveau Client (customerId, customerName, customerCode);
double grandTotal = client.grandTotal (total);

@Test
@Afficher un nom("Tester le client's Constructeurs de classes, getters et setters et méthodes.")
annulerclientBuilder(){
assertAll(() -> {
assertEquals(N ° de client, client.getCustomerId());
assertEquals(NomClient, client.getCustomerName());
assertEquals(code client, client.getCustomerCode());
assertEquals(0.10, client.Type de client(code client));
assertEquals (540, grandTotal);
});
}
}
}

La classe CustomerTest est la classe de test de niveau supérieur d'une classe CustomerBuilderTest imbriquée. CustomerBuilderTest crée un nouvel objet Customer et teste ses composants à l'aide de tests d'assertion.

L'exécution de la classe de test CustomerTest produit les résultats de test réussis suivants :

Les noms des classes de test et de la méthode de test sont descriptifs et complets, grâce aux Annotation @DisplayName.

Savoir comment tester un logiciel est crucial

La technologie est un aspect important de la vie quotidienne de la plupart des gens. Les enjeux pour créer un logiciel qui fait exactement ce qu'il est censé faire n'ont jamais été aussi élevés.

Une voiture autonome qui calcule mal sa proximité avec un autre objet peut provoquer un accident majeur. Par conséquent, vous devez tester votre application à chaque étape de son développement.