Créer JUnit Suite de tests avec exemple : @RunWith @SuiteClasses

⚡ Résumé intelligent

JUnit Les suites de tests regroupent les cas de test de plusieurs classes afin qu'ils s'exécutent ensemble en une seule passe, pilotées par les annotations @RunWith(Suite.class) et @SuiteClasses et lancées via une classe d'exécution de tests ordinaire.

  • (I.e. Objectif : Regroupez les tests de plusieurs classes en une seule unité exécutable au lieu de lancer chaque classe de test séparément.
  • ☑️ Annotations: @RunWith(Suite.class) délègue l'exécution, tandis que @SuiteClasses liste toutes les classes que la suite doit exécuter.
  • Étape: Écrivez les classes de test, ajoutez une classe conteneur contenant les deux annotations, puis exécutez-la à partir d'un JUnitCoureur principal.
  • 🧪 Exemple : Le fichier JunitTest.java regroupe SuiteTest1 et SuiteTest2, et la console signale trois tests réussis.
  • JUnit 5: Jupiter remplace le runner par @Suite plus @SelectClasses ou @SelectPackages sur le moteur de suite de la plateforme.
  • 📌 Pièges Les suites vides, les importations manquantes et une classe de suite possédant ses propres méthodes @Test sont à l'origine de la plupart des échecs.

Création d'un JUnit Suite de tests avec annotations @RunWith et @SuiteClasses

In JUnit, une suite de tests nous permet de regrouper tous cas de test regrouper plusieurs classes en un seul endroit et les exécuter simultanément.

Pour exécuter la suite de tests, vous devez annoter une classe à l'aide des annotations mentionnées ci-dessous :

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

Grâce aux annotations ci-dessus, toutes les classes de test de la suite s'exécuteront une à une. La classe de la suite reste vide : elle sert uniquement à stocker les annotations, et le programme d'exécution les lit pour déterminer les tests à exécuter.

Étapes pour créer une suite de tests et un exécuteur de tests

Les quatre étapes ci-dessous permettent de construire la plus petite suite de tests exécutable : deux classes de tests ordinaires, une classe de suite qui les nomme et un exécuteur qui lance la suite à partir d’une méthode principale.

Étape 1) Créez une classe de test simple (par exemple MyFirstClassTest) et ajoutez une méthode annotée avec @Tester.

La première classe contient une seule méthode de test vide, ce qui suffit à prouver que la suite de tests la détecte :

Ma classe de test de première classe Eclipse déclarer une méthode myFirstMethod annotée @Test

Étape 2) Créez une autre classe de test à ajouter (par exemple MySecondClassTest) et créez une méthode annotée avec @Test.

La deuxième classe suit exactement la même forme, la suite comporte donc deux classes distinctes à agréger :

Ma classe de test de deuxième classe dans Eclipse déclarer une méthode mySecondMethod annotée @Test

Étape 3) Pour créer une suite de tests, vous devez d'abord annoter la classe avec @RunWith(Suite.class) et @SuiteClasses(class1.class, class2.class…).

Notez que la classe de suite TestSuiteExample ne déclare aucune méthode de test propre ; les deux annotations contiennent toutes les informations :

TestSuiteExample annoté avec @RunWith(Suite.class) et @SuiteClasses nommés MyFirstClassTest et MySecondClassTest

Étape 4) Créez une classe Test Runner pour exécuter notre suite de tests comme indiqué ci-dessous :

Le coureur est un simple Java classe avec une méthode principale qui transmet la classe suite à JUnitCore:

Appel de classe du lanceur de tests JUnitExécution de Core.runClasses sur TestSuiteExample et affichage de la liste des échecs

Code Explication:

  • Code Ligne 8: Déclaration de la méthode principale de la classe Test qui exécutera notre JUnit test.
  • Code Ligne 9: Exécution des cas de test à l'aide de JUnitCore.runClasses qui prend le nom de la classe de test comme paramètre (dans l'exemple ci-dessus, vous utilisez TestSuiteExample.class présenté à l'étape 3).
  • Code Ligne 11: Traitement du résultat à l'aide d'une boucle for et affichage du résultat d'échec.
  • Code Ligne 13: Impression du résultat réussi.

Sortie : Voici le résultat qui montre un test réussi sans aucun échec. trace comme indiqué ci-dessous :

Eclipse JUnit Afficher le rapport : 2/2 exécutions sans erreur ni échec pour TestSuiteExample

La barre verte confirme la fonction d'une suite : un seul lancement, une seule vue des résultats, et les deux classes sont regroupées sous le nœud de la suite plutôt que dans deux exécutions distinctes.

JUnit Exemple de suite de tests

Prenons un exemple plus complexe, dans lequel les classes à l'intérieur de la suite sont en réalité… affirmer quelque chose au lieu de maintenir une méthode vide.

JunitTest.java

JunitTest.java est une classe simple annotée avec @Courir avec et @Suite annotations. Vous pouvez indiquer autant de classes de la suite que vous le souhaitez en tant que paramètres, comme indiqué ci-dessous :

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 est une classe de test possédant des méthodes de test qui affichent un message, comme indiqué ci-dessous. Vous utiliserez cette classe comme membre de la suite dans la classe mentionnée ci-dessus. Elle s'appuie sur une classe auxiliaire nommée JUnitMessage, qui est défini ailleurs dans le même paquet et n'est pas reproduit ici.

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 est une autre classe de test, similaire à SuiteTest1.java, possédant une méthode de test pour afficher un message comme indiqué ci-dessous. Vous utiliserez cette classe comme membre de la suite dans 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);							
    }		

}		

Sortie

Après avoir exécuté Test Junit.java, qui contient une suite contenant SuiteTest1.java et SuiteTest2.javaVous obtiendrez le résultat ci-dessous. La console affiche les messages produits par les deux classes :

Eclipse La console affiche les messages imprimés des deux classes de la suite après l'exécution de JUnitTest.

Le JUnit Afficher les enregistrements de la même exécution que trois méthodes de test réussies regroupées sous la classe de suite :

Eclipse JUnit Affichage du rapport : 3/3 exécutions réussies pour JUnitTest avec les suites de tests 1 et 2 étendues.

À noter: Dans cet exemple, les étiquettes de la console sont inversées : la chaîne affichée par SuiteTest1 est « Suite Test 2 » et celle affichée par SuiteTest2 est « Suite Test 1 ». Les listes originales sont reproduites sans modification, les étiquettes restent donc telles que l’auteur les a écrites ; lisez le nom de la classe dans le JUnit Consultez l'image plutôt que l'étiquette imprimée lorsque vous faites correspondre la sortie à la source.

Comment créer une suite de tests dans JUnit 5

JUnit La version 5 supprime complètement les runners, donc @RunWith(Suite.class) n'existe pas dans les packages org.junit.jupiter. Les suites ont été déplacées vers JUnit Plateforme, qui les expédie dans un artefact séparé appelé moteur de suite de plateforme JUnitAjoutez cette dépendance, puis annotez une classe avec @Suite et l'une des annotations de sélecteur.

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
}

Les annotations de sélecteur remplacent la liste unique @SuiteClasses par une petite famille d'options :

Annotation Ce qu'il sélectionne
@SelectClasses Classes de test individuelles nommées une par une, remplaçant directement @SuiteClasses.
@SelectPackages Chaque classe de test du package nommé et de tous ses sous-packages.
@IncludeClassNamePatterns Un filtre d'expression régulière appliqué à la sélection.
@SuiteDisplayName Un nom lisible affiché dans le rapport à la place du nom de la classe.

Deux autres différences ont leur importance en pratique. A JUnit 5. La classe de suite peut déclarer des méthodes @BeforeSuite et @AfterSuite, qui s'exécutent une seule fois pour l'ensemble de la suite, et la JUnit L'exemple 4 ci-dessus s'exécute toujours sur le JUnit La plateforme utilise le moteur d'origine, il n'est donc pas nécessaire de réécrire le code original de cette page pour qu'il continue de fonctionner.

Avantages et limites de JUnit Suites de test

Une suite est un groupeping mécanisme, pas un cadre de test de sa propre nature, et cela détermine à la fois ses points forts et ses limites.

Avantages

  • Un lancement permet de gérer des classes similaires ensemble, donc un ensemble de fumée ou un régression Le processus se lance avec une seule commande.
  • L'affichage des résultats regroupe chaque classe sous un seul nœud de suite, ce qui facilite le repérage d'une défaillance partagée.
  • La liste des membres est codée dans le code, elle est donc vérifiée et versionnée comme n'importe quel autre fichier source.
  • La même classe de suite peut être lancée depuis un IDE, depuis un exécuteur tel que JUnitNoyau, ou à partir d'un outil de construction.

Limites

  • @SuiteClasses est une liste codée en dur, donc une nouvelle classe de test est silencieusement omise jusqu'à ce que quelqu'un modifie la suite.
  • La suite ne donne aucune garantie d'ordre au-delà de l'ordre dans lequel les classes sont listées.
  • Rien n'est partagé entre les classes membres ; une suite ne remplace donc pas une fixture ou une classe de base.
  • Les outils de construction détectent déjà les classes de test grâce aux conventions d'appellation, ce qui rend une suite de tests redondante sur de nombreux projets.

Erreurs courantes lors de la création d'un JUnit Suite de tests

La plupart des problèmes de suite logicielle génèrent un message court et peu informatif. Le tableau ci-dessous répertorie les messages les plus courants, leurs causes et leurs solutions.

Message ou symptôme Causes Fixer
Erreur d'initialisation : aucune méthode exécutable La classe est exécutée comme une classe de test ordinaire, mais elle ne contient que des annotations. Ajoutez @RunWith(Suite.class) pour que le lanceur de la suite prenne le relais au lieu du lanceur par défaut.
Symbole introuvable : classe Suite L'importation de la suite est manquante. Importez org.junit.runners.Suite en plus de org.junit.runner.RunWith.
La suite se déroule sans problème, mais un cours est manqué. La classe n'a jamais été ajoutée à la liste @SuiteClasses. Ajoutez la classe explicitement ou déplacez-la vers @SelectPackages dans JUnit 5.
Le nom de classe n'est pas accepté par le compilateur. L'annotation @Runwith ou @suiteClasses a été saisie avec une casse incorrecte. Java Les annotations sont sensibles à la casse : écrivez @RunWith et @SuiteClasses exactement.
Les tests de la classe de suite elle-même ne sont jamais exécutés. Une méthode @Test a été ajoutée au conteneur de la suite. Laissez le conteneur vide et déplacez la méthode de test dans une classe membre.

Écrire la suite une fois et garderping La précision est le véritable travail. Si la liste s'éloigne des classes sur le disque, la suite signale un problème au vert tandis qu'une partie de la Test de l'unité La commande set ne s'exécute jamais, l'un des modes de défaillance les plus silencieux. test logiciel.

FAQ

La suite exécute les classes dans l'ordre où elles sont listées, mais JUnit Cela ne garantit pas l'ordre des méthodes au sein de chaque classe. Les tests dépendant de l'exécution d'un test précédent sont fragiles et devraient être réécrits pour être autonomes.

Oui. Une classe de suite est une classe ordinaire pour l'exécuteur ; l'inclure dans une autre liste `@SuiteClasses` imbrique donc les suites. Cette imbrication est utile pour une suite de régression de niveau supérieur construite à partir de suites de modules plus petites.

Les assistants IA lisent les classes de test sur le disque, les comparent à la liste @SuiteClasses et signalent les classes qui n'ont jamais été ajoutées. Ils regroupent également les échecs répétés. tracpar cause racine, ce qui raccourcit le triage après qu'une suite ait signalé de nombreux problèmes simultanément.

Copilot écrit rapidement la paire d'annotations, mais elle les mélange fréquemment JUnit 4 et JUnit Cinq importations dans le même fichier. Vérifiez que org.junit.runners.Suite et org.junit.platform.suite.api.Suite n'apparaissent jamais ensemble, car une seule d'entre elles correspond à votre runner.

Ajoutez junit-platform-suite-engine au périmètre de test. Les annotations @Suite et @SelectClasses se trouvent dans junit-platform-suite-api, que cet artefact moteur inclut transitivement ; une seule dépendance suffit donc généralement.

Généralement non. Surefire et le Gradle La tâche de test identifie déjà les classes de test par leur nommage et les exécute toutes. Il est judicieux de créer une suite de tests lorsque vous souhaitez un sous-ensemble nommé, comme un ensemble de tests de fumée, plus petit que l'ensemble complet.

Le lanceur d'exécution signale une erreur d'initialisation pour ce membre, indiquant qu'aucune méthode exécutable n'a été trouvée, et l'ensemble de la suite de tests est marqué comme ayant échoué. Supprimez l'entrée ou ajoutez une méthode annotée avec `@Test` à la classe.

Pas dans une seule liste de sélection. Conservez le JUnit 4 classes sur le moteur vintage et sélectionnez-les parmi un JUnit 5 suites par package, donc les deux moteurs fonctionnent sous le même système. JUnit Lancement de la plateforme sans mélanger les familles d'annotations.

Résumez cet article avec :