Découvrez GoogleTest certifié TÜV avec Agentic AI pour les tests C/C++ !
Plus de détails »
Blog Parasoft
Comprenez les bases et faites évoluer votre pratique de test unitaire comme un pro avec ce didacticiel.
Aller à la section
Voulez-vous ignorer les bases et voir comment automatiser génération de tests unitaires améliorée avec l'IA passer de 0 à 60 % de couverture de code en moins de 5 minutes ? Découvrez Jtest >>
JUnit est le framework de test unitaire Java le plus populaire. Un framework open-source, il est utilisé pour écrire et exécuter des tests automatisés reproductibles.
JUnit s'est imposé comme la norme de facto pour les tests unitaires Java grâce à une combinaison de fonctionnalités puissantes et bien conçues, fonctionnant en parfaite harmonie. Premier framework de tests unitaires développé à ce jour, il demeure le choix privilégié des développeurs Java du monde entier grâce à ses caractéristiques uniques et à son évolution constante.
Comme pour tout le reste, le framework de test JUnit a évolué au fil du temps.
JUnit 4.0 est sorti en 2006, la version 5.0 en 2017 et la version 6.0 en septembre 2025.
En février 2026, la dernière version est la 6.0.2.
Voici quelques-uns des aspects et fonctionnalités clés de JUnit, ainsi que les différences entre les versions :
| Caractéristique/Aspect | Unité 4 | Unité 5 | Unité 6 |
|---|---|---|---|
| Année de sortie d'origine | 2006 | 2017 | 2025 |
| Architecture | Architecture monolithique avec toutes les fonctionnalités dans un seul jar | Fournit 3 modules : JUnit Platform (base pour le lancement des tests), JUnit Jupiter (API pour l’écriture des tests) et JUnit Vintage (exécute les tests plus anciens). | Les 3 modules partagent désormais le même numéro de version |
| Version minimale de Java | 5 | 8 | 17 |
| Nommer les tests | Le nom de la méthode sert de nom de test | Le @Afficher un nom L'annotation permet d'utiliser des noms de tests descriptifs et lisibles par l'humain. | Identique à JUnit 5 |
| Mise en place et démontage des tests | Fournit des annotations pour configurer l'état avant chaque test ou avant tous les tests d'une classe : @Avant, @Après, @AvantClasse, @AprèsClasse | Fournit différentes annotations pour configurer l'état avant chaque test ou avant tous les tests d'une classe : @AvantChaque, @AprèsChaque, @AvantTout, @AprèsTout | Identique à JUnit 5 |
| Affirmations | Fournit des méthodes dans org.junit.Assert Classe permettant de vérifier les résultats attendus. Si une assertion échoue, les autres ne sont pas exécutées. | Fournit des méthodes dans org.junit.jupiter.api.Assertions classe avec des messages d'erreur améliorés, y compris assertAll () vérifier plusieurs assertions simultanément, même si l'une d'entre elles échoue. | Identique à JUnit 5 |
| Vérification des exceptions attendues | permet @Test(attendu = Exception.class) Annotation permettant de vérifier qu'une assertion a été levée, mais impossible de vérifier le message d'exception ni les détails. | permet assertThrows () méthode permettant des assertions détaillées sur le message d'exception et les détails | Identique à JUnit 5 |
| Vérification et application des performances | permet @Test (délai d'attente = 1000) annotation pour vérifier que le test ne dépasse pas le temps prévu et pour empêcher les tests de s'exécuter indéfiniment. | permet assertTimeout () et assertTimeoutPreemptively () méthodes pour vérifier les performances de blocs de code spécifiques et @Temps libre annotation pour l'ensemble du test | Identique à JUnit 5 |
| Tests paramétrés | Nécessite un exécuteur distinct spécifié par @RunWith(Parameterized.class) annotation dans une classe de test séparée | Assistance de première classe via @Test Paramétré annotation permettant de mélanger des tests paramétrés avec des tests non paramétrés | Utilise un analyseur CSV moderne pour un comportement et des performances améliorés. @CsvSource et @CsvFileSource annotations |
| Tests d'invalidation | permet @Ignorer annotation qui ignore silencieusement le test | permet @Désactivée Annotation pour les méthodes de test individuelles et les classes entières permettant de signaler une raison | Identique à JUnit 5 |
| Tests imbriqués | Non pris en charge | permet @Nested annotation permettant d'utiliser des classes de tests internes pour une meilleure organisation des tests associés | Commande mise à jour pour @Nested classes déclarées dans la même classe ou interface englobante |
| Groupement des tests | permet @Catégorie Annotation pour regrouper les tests, mais nécessite des classes d'exécution et de catégorie distinctes. | permet @Étiqueter Annotation permettant de regrouper les tests à l'aide d'une étiquette simple ; ne nécessite pas d'exécuteur séparé. | Identique à JUnit 5 |
| Conditions préalables au test | Fournit des méthodes dans Supposer classe permettant de contrôler si le test est exécuté en fonction de facteurs d'environnement spécifiés | Fournit une méthode d'hypothèse améliorée Hypothèses.supposeQue() qui permet un contrôle précis de l'exécution d'un bloc de code spécifique en fonction de l'environnement | Identique à JUnit 5 |
| Personnalisation du comportement | Fournit des exécuteurs et des règles pour prendre en charge la personnalisation du comportement du framework de test, mais ils présentent certaines limitations. | Utilise un seul modèle d'extension flexible | Utilise le même modèle d'extension que JUnit 5, mais il a été simplifié. |
| Rétrocompatibilité | Peut exécuter des tests JUnit 3 | Il est possible d'exécuter des tests JUnit 3 et 4 via le moteur Vintage. | Le moteur Vintage existe toujours, mais il est obsolète. |
Ces fonctionnalités se combinent de manière synergique pour créer un cadre complet et extensible qui prend en charge les pratiques de développement logiciel professionnelles.
Alors, entrons dans le vif du sujet. Voici les étapes pour configurer JUnit.
Les IDE les plus courants, tels qu'Eclipse et IntelliJ, auront déjà l'intégration des tests JUnit installée par défaut.
Si vous n'utilisez pas d'IDE et que vous vous appuyez uniquement sur un système de construction tel que Maven ou Gradle, la configuration de JUnit est gérée respectivement via le fichier pom.xml ou build.gradle.
Il est important de noter que Unité 5 a été divisé en trois modules, dont l'un est un module vintage qui prend en charge l'exécution de Unité 4 et trois tests de Unité 5.
Unité 6 conserve cette architecture.
Unité 3 Son utilisation est très faible à ce stade et ne se rencontre généralement que dans des projets beaucoup plus anciens.
En raison du caractère modulaire de JUnit 6, un POM de nomenclature est utilisé pour importer tous les modules et dépendances JUnit. Si seuls des modules spécifiques sont nécessaires, des groupes ou des artefacts individuels peuvent être spécifiés.
Pour ajouter JUnit 6 à Maven, ajoutez ce qui suit à pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.0.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Pour Gradle, ajoutez ce qui suit au fichier build.gradle :
dependencies {
testImplementation platform("org.junit:junit-bom:6.0.2")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
testRuntimeOnly "org.junit.platform:junit-platform-launcher"
}
test {
useJUnitPlatform()
}
En raison du caractère modulaire de JUnit 5, un POM de nomenclature est utilisé pour importer tous les modules et dépendances JUnit. Si seuls des modules spécifiques sont nécessaires, des groupes ou des artefacts individuels peuvent être spécifiés.
JUnit 5 est configuré de la même manière que JUnit 6 :
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.14.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.14.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Pour Gradle, ajoutez ce qui suit au fichier build.gradle :
dependencies {
testImplementation platform("org.junit:junit-bom:5.14.2")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
testRuntimeOnly "org.junit.platform:junit-platform-launcher"
}
test {
useJUnitPlatform()
}
Pour ajouter JUnit 4 à Maven, ajoutez ce qui suit à pom.xml.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
Pour Gradle, ajoutez ce qui suit au build.gradle:
dependencies {
testImplementation 'junit:junit:4.13.2'
}
test {
useJUnit()
}
Si vous devez ajouter manuellement JUnit au classpath pour les tests JUnit, vous devez référencer directement le ou les fichiers JAR bruts, bien que cela ne soit généralement pas nécessaire. JUnit 4, 5 et 6 proposent tous des fichiers JAR téléchargeables directement. Pour JUnit 5 et 6, vous devrez télécharger un fichier JAR volumineux (également appelé « uber jar ») comme décrit. ici.
Améliorer les tests unitaires pour Java avec l'automatisation: les meilleures pratiques pour les développeurs Java
Maintenant que nous avons parlé un peu de la configuration de JUnit, passons à la construction et à l'exécution réelles de ces tests. Pour mieux illustrer la création de JUnits, nous allons commencer par quelque chose de basique. Dans l'exemple de test JUnit ci-dessous, nous avons une méthode simple (à gauche) qui convertit Fahrenheit en Celsius et un test JUnit (bien) écrit pour tester notre méthode. J'ai numéroté les parties clés du test JUnit et discuterai de chaque partie en détail ci-dessous.
Les parties 1 et 2 de la capture d'écran ci-dessus correspondent aux importations des classes et méthodes JUnit utilisées par le test unitaire. Ces importations peuvent être spécifiées individuellement, mais on les spécifie généralement sous forme de packages entiers, indiqués par des astérisques. Les deux méthodes fonctionnent ; le niveau de détail des importations est une question de préférence.
La partie 3 définit le début de notre classe de test. Il est important de noter ici la convention de nommage utilisée pour la classe, qui est : NomClasseTest. Cette convention de dénomination n'est pas obligatoire, mais c'est la manière la plus courante de nommer les classes JUnit, car le nom décrit succinctement l'objectif de la classe de test unitaire et la classe qu'elle teste.
Dans la partie 4, nous découvrons notre première syntaxe spécifique à JUnit : l’annotation `@Test`. Les annotations sont essentielles lors de la création de tests JUnit. Elles permettent au framework JUnit d’identifier les éléments importants du test unitaire. Dans notre exemple, l’annotation `@Test` indique à JUnit que la méthode publique `void` à laquelle elle est associée peut être exécutée comme un cas de test.
Il existe de nombreuses autres annotations, mais voici quelques-unes des plus courantes pour JUnit 5 et 6.
Pour la partie 5, notez à nouveau la convention d'appellation testMethodNametestMethodName, Où NomMéthode Le nom de la méthode testée dans la classe testée est indiqué. Cette convention d'appellation est courante, mais non obligatoire. Il arrive qu'une description supplémentaire soit ajoutée au nom pour décrire le comportement spécifique vérifié par le test.
Dans la partie 6, le Donné section du test, nous construisons une nouvelle instance de la classe testée et l'initialisons comme il convient. Ceci est nécessaire car la méthode de test doit appeler la méthode testée pour la tester. Dans notre exemple, aucune autre initialisation n'est nécessaire au-delà de l'instanciation de la classe, mais dans de nombreux cas, une configuration supplémentaire peut être nécessaire, comme l'initialisation d'objets à transmettre au constructeur ou l'appel de méthodes qui configurent l'état de la classe testée.
Dans la partie 7, le Lorsque vous La section du test comprend l'initialisation des variables qui doivent être transmises lors de l'appel de la méthode testée, puis de l'appel de la méthode de test (partie 8). Les variables doivent recevoir des valeurs significatives qui amènent le test à exercer les parties de la méthode de test qui nous intéressent. Notez que si une variable est un objet, elle peut être instanciée ou simulée.
Dans la partie 8, si la méthode testée renvoie une valeur, celle-ci doit être capturée dans une variable afin que sa valeur puisse être vérifiée.
Les tests unitaires ne sont utiles que s'ils incluent des assertions qui vérifient que la méthode testée renvoie la valeur attendue et/ou modifie l'état des autres objets comme prévu. Sans assertions, comme expliqué dans la partie 9, aucune vérification n'est effectuée. Votre test n'est alors, au mieux, qu'un test de fumée qui ne fournit de retour d'information que lorsqu'une exception est levée.
Les méthodes d'assertion JUnit, incluses dans la classe `org.junit.jupiter.api.Assertions` dans JUnit 5 et 6, et dans la classe `org.junit.Assert` dans JUnit 4, servent généralement à déterminer la réussite ou l'échec des tests. Seules les assertions ayant échoué sont signalées par le framework JUnit. À l'instar des annotations, de nombreuses options d'assertion sont disponibles.
Dans notre exemple JUnit ci-dessus, nous utilisons la méthode assertEquals (expected, actual, delta). Le premier argument est :
Choisissez votre propre aventure ! Ici, nous examinerons trois façons d'exécuter JUnits :
Dans l'Explorateur de packages, localisez votre test JUnit. Cliquez avec le bouton droit et sélectionnez Exécuter en tant que > Test JUnit. Cela exécutera votre test et rapportera les résultats dans la vue JUnit Eclipse.
L'exécution d'un test dans IntelliJ est similaire à Eclipse. Dans la fenêtre Projet, localisez votre test, cliquez avec le bouton droit de la souris et sélectionnez Exécuter 'testName'. Comme Eclipse, une fenêtre JUnit s'ouvrira avec les résultats du test.
Maven simplifie l'exécution des tests unitaires. Assurez-vous d'être au bon endroit dans votre console et que le fichier pom.xml de votre projet est correctement configuré. Vous pouvez ensuite exécuter la commande suivante pour lancer vos tests JUnit.
Pour exécuter l'intégralité de la suite de tests :
mvn test
Pour exécuter un ou plusieurs tests uniques/spécifiques :
mvn -D test=TestName test
Gradle, tout comme Maven, a simplifié l'exécution des tests.
Pour exécuter l'intégralité de la suite de tests :
gradlew test
Pour exécuter un ou plusieurs tests uniques/spécifiques :
gradlew -D test.single=testName test
Remarque : Maven et Gradle sont leurs propres bêtes. Ce qui est montré ici est minimal pour couvrir les bases. Consultez leur documentation si vous voulez en savoir plus.
Pour exécuter une JUnit directement depuis la ligne de commande, vous avez besoin de quelques éléments :
La méthode la plus simple pour y parvenir dans JUnit 5 et 6 consiste à utiliser le lanceur de console JUnit comme suit.
java -jar /path/to/junit-platform-console-standalone-<version>.jar execute -cp /path/to/source/classes -cp /path/to/test/classes <test class name>
Remarque : l'exécution d'un test à partir de la ligne de commande est le plus souvent effectuée à partir d'un processus CI/CD s'exécutant dans un système de génération tel que Jenkins ou Azure DevOps.
Notre exemple a exécuté un test unitaire simple, et bien sûr, ce n'est que le début des tests unitaires. Les méthodes plus complexes à tester peuvent appeler des méthodes de classes dépendantes ou se connecter à des systèmes externes comme une base de données. Dans ce cas, il peut être judicieux d'isoler le code par simulation.
La moquerie aide à isoler les unités de code afin que nos tests unitaires puissent se concentrer uniquement sur la classe/méthode spécifique testée. Le framework le plus couramment utilisé pour se moquer dans les tests JUnit est Mockito.
Pour en savoir plus sur les moqueries, lisez le post de mon collègue : Comment automatiser un test unitaire Java, y compris les simulations et les assertions.
Si les tests unitaires sont si importants, pourquoi tout le monde ne les pratique-t-il pas systématiquement ? Malgré leur importance, les tests unitaires ne sont pas toujours faciles à mettre en œuvre ni à maintenir. Ils nécessitent une connaissance approfondie du développement et un effort constant pour maintenir les suites de tests à jour. Par conséquent, les tests unitaires sont souvent relégués au second plan, jusqu'à ce que des régressions surviennent.
Mais il ne doit pas en être ainsi.
C'est ici que Parasoft Jtest Voici son assistant de tests unitaires basé sur l'IA, conçu pour simplifier l'écriture et la maintenance des tests unitaires. En quelques clics, les équipes qui débutent avec 0 % de tests unitaires peuvent les réaliser facilement. couverture de code peut générer automatiquement des suites de tests robustes couvrant 60 % ou plus de leur code Java. cabinet de services financiers a noté : « Depuis que nous avons implémenté Parasoft Jtest, nous avons réussi à réduire de plus de 50 % le temps nécessaire à la création et à la maintenance des tests unitaires. »
Voici comment votre équipe peut faire évoluer votre pratique de test.
Si l'écriture et la maintenance des tests JUnit vous semblent fastidieuses, il est temps de moderniser votre approche. Des solutions de test optimisées par l'IA comme celle-ci peuvent transformer la création de tests, autrefois un goulot d'étranglement, en un avantage stratégique, vous permettant ainsi de consacrer plus de temps à la création de logiciels performants.
Facilitez et accélérez les tests unitaires avec Parasoft Jtest amélioré par l'IA.
Essayez-le vous-même avec un essai gratuit et complet pendant 14 jours.