Junit 4, le célèbre cadre de tests unitaires Java, est sorti depuis longtemps. À cette époque, j'ai constaté que Junit 5 était en version bêta, donc j'allais écrire un article pour présenter Junit 5. Cependant, parce que c'est toujours une version bêta, certaines parties ne sont pas parfaites, et je suis un peu paresseux et ne les écrivent pas bien. Je me suis soudainement souvenu de cet incident ces jours-ci. Lorsque je l'ai vérifié sur le site officiel, j'ai trouvé que le 10 septembre, la version officielle de Junit 5 est finalement sortie! Ensuite, j'ai rédigé l'article à nouveau et vous présente le dernier cadre Junit.
Structure du cadre
Par rapport à JUnit 4, la structure de JUnit 5 est très claire et fournit une bonne prise en charge pour les fonctions étendues telles que les plug-ins personnalisés, l'exécution des tests IDE, etc. Cela peut être vu à partir de la structure du projet.
Plate-forme Junit
Le nom du package de ce groupe est org.junit.platform. Comme vous pouvez le voir sur le nom, la fonction principale de ce groupe est de servir de plate-forme de base pour le cadre de test. Les modules dans ce package comprennent des API de base, des moteurs d'exécution et des exécuteurs, des fonctions d'exécution de ligne de commande, des interfaces de ligne de commande, des plug-ins de test Maven et Gradle et d'autres fonctions de base.
Junit Jupiter
Jupiter est le nom de code de Junit 5. Les modules de ce package contiennent les fonctions principales de Junit 5. Si nous voulons utiliser Junit 5, nous devons inclure cet ensemble de modules.
Junit Vintage
Vintage est le nom de code de l'ancienne version de Junit. Les modules dans ce package nous permettent d'exécuter des tests d'ancien Junit 3 et 4 sur la nouvelle plate-forme Junit.
Bibliothèque de classe d'importation
Alors que JUnit 5 est toujours en phase bêta, il existe des exemples d'intégration de Junit 5 à Maven et Gradle dans la documentation officielle. Mais dans la version officielle, le contenu de cette partie a disparu, ne laissant que deux liens vers l'exemple de projet, référons-y (copier et coller).
Utilisation de maven
Junit5-Maven-Consumer est l'exemple officiel de Maven. J'allais à l'origine publier la configuration de POM pertinente ici, mais quand j'ai vu que la configuration de Maven était trop longue, je ferais mieux de l'oublier. Si vous avez des exigences, veuillez vérifier vous-même la configuration du POM de ce projet.
Utilisation de Gradle
Si vous utilisez Gradle, ce problème est beaucoup plus simple. Il existe également des descriptions détaillées dans le projet d'échantillon de consommation junit5 gradle.
Tout d'abord, Gradle ne prend pas en charge JUnit 5 par défaut, donc le plug-in de plate-forme Junit Gradle doit être activé pour le prendre en charge.
buildScript {Repositories {mavencentral ()} dépendances {classpath 'org.junit.platform: Junit-PlatForm-Gradle-Plugin: 1.0.0'}} Appliquer le plugin: 'org.Junit.platform.gradle.plugin'Ensuite, il y a la configuration de ce plugin Gradle. Par défaut, tous les moteurs et balises seront exécutés. Si vous souhaitez choisir d'effectuer des tests uniquement pour certains moteurs et balises, vous pouvez décommenter ce qui suit et les modifier en fonction de vos propres besoins. Bien sûr, si vous n'avez pas ces exigences avancées, vous pouvez supprimer cette partie.
JUNITPLATFORM {// PlatformSion '1.0.0' Filtres {moteurs {// inclue 'Junit-Jupiter', 'Junit-vintage' // Exclusion 'Custom-Engine'} Tags {// Inclure 'Fast' Exclude 'Slow'} // IncludeClassNamePattern '. File ('build / test-résults / Junit-Platform') // Ceci est la valeur par défaut // Logmanager 'org.apache.logging.log4j.jul.logmanager'}Si vous n'avez besoin que d'exécuter les tests JUnit 5, importez simplement les deux dépendances suivantes. Les dépendances de la plate-forme JUnit sont automatiquement importées.
Dépendances {TestCompile ("org.Junit.Jupiter: Junit-Jupiter-API: 5.0.0") TestRuntime ("org.Junit.jupiter: Junit-Jupiter-Engine: 5.0.0")}Si vous souhaitez exécuter les anciens tests JUnit 3 et 4 sous la nouvelle plate-forme, vous devez importer les dépendances suivantes.
dépendances {testCompile ("Junit: Junit: 4.12") TestRuntime ("org.junit.vintage: Junit-vintage-Engine: 4.12.0")}Des tests d'écriture
Test de Junit 4
Si toute la configuration précédente est terminée, vous pouvez commencer à écrire des tests maintenant. Tout d'abord, passons en revue l'ancien test Junit 4.
classe publique JUnit4test {@Beforeclass public static void init () {System.out.println ("avant class");} @ AfterClass public static void clean () {System.out.println ("après class");} @ avant le public Void avant () {System.out.println ("avant");} @ après le public Avant () After () GensUtilisez Gradle Test et d'autres commandes pour exécuter ce test. Le résultat est similaire à cela.
Avant la classe ClassBoreTest 1Test 2After Classe
Test de Junit 5
Jetons un coup d'œil à la façon d'écrire le test JUnit 5 équivalent. Le changement le plus évident peut être vu: tout d'abord, plusieurs annotations ont été renommées de noms plus célèbres; Un autre point est que la méthode de test ne doit pas être une méthode publique, nous pouvons donc taper le clavier quelques fois moins.
classe publique Junit5Test {@beForeAll static void beForeAll () {System.out.println ("Before all");} @ Afterall static void afterall () {System.out.println ("After all");} @ avanteach void avant () {System.out.println ("avant");} @ Aftereach Not {System.out.println ("After");} @ test void test1 () {System.out.println ("test 1");} @ test void test2 () {System.out.println ("test 2");}}Écrire des affirmations
Pour vérifier que les cas de test sont corrects, nous devons rédiger des affirmations. JUnit 5 est livré avec de nombreuses affirmations qui peuvent nous aider à rédiger des cas de test. De plus, ces affirmations sont livrées avec des versions surchargées qui peuvent accepter les expressions Lambda, qui conviennent très à l'utilisation de Java 8. Bien sûr, je pense personnellement qu'il est plus pratique d'AssertJ.
import static org.junit.assert.assertTrue; import static org.junit.jupiter.api.assertions. *; public class assertiondemo {@test void testAssertion () {asserTequals (10, 10); assertTrue (true); assertequals (100, 100, "deux nombres égaux"); assertall ("numéro", () -> asserTequals ("name", "name"), () -> asserTequals (500, 500)); assertThrows (invalidParameTerexception.class, () -> {lancer un nouveau invalidParameTereException ();}); int result = assertTimeout (durée.ofseconds (5), () -> {int i = 0, j = 0; while (i <= 100) {for (; j <= 100000; j ++) j ++; i ++;} return i;}); asserttequals (100, résultat); }}Injection de dépendance
Maintenant, le constructeur et les méthodes de test de la classe de test peuvent accepter les paramètres. L'interface paramètres de ditsolver définit comment injecter des paramètres à l'exécution. Plusieurs intégrés nous permet d'obtenir des informations sur l'exécution du cas de test.
Le premier est Testinfoparameterresolver. S'il existe une instance de type TesInfo sur la méthode, le cadre JUnit 5 injectera automatiquement l'instance. Plusieurs méthodes de cette instance peuvent nous permettre d'obtenir le nom, le nom d'affichage, l'étiquette et d'autres informations de la classe de test et de la méthode de test.
classe publique DependencyInjectionDemo {@Test @DisplayName ("Dependency Injection") @tag ("test") void testDisplayName (Testinfo Testinfo) {ASSERTEQUALS ("Injection de dépendance", Testinfo.getDisplayName ()); asserTequals (Collection.Singleton ("test"), Testinfo.getTags ()); }}Il existe également des analyseurs de paramètres intégrés tels que RepetitionInfoparameTerresolver, qui sera introduit plus tard.
Annotations communes
nom d'affichage
Nous pouvons ajouter des noms personnalisés aux classes de test et aux méthodes de test, qui sont affichées par le coureur de test et les rapports de test. Le nom d'affichage ne s'affiche pas comme un nom de variable. Il peut s'agir d'une longue chaîne contenant des espaces, ou même un emoji emoji.
@DisplayName ("La classe de test peut spécifier le nom d'affichage") la classe publique DisplayNameDemo {@Test @DisplayName ("La méthode de test peut également spécifier le nom d'affichage") VOID TestWithLongDisplayName () {} @test @DisplayName ("Le nom d'affichage peut également contenir des emoticons ��")Désactiver les tests
L'annotation @Disabled peut être utilisée sur les classes de test ou les méthodes de test, et le test correspondant peut être désactivé.
@DisabledPublic Class DisabledTestDemo {@Test // @ Disabled void testDisabled () {}}Répéter
Si vous avez besoin d'une méthode de test à plusieurs reprises, utilisez l'annotation @repeatedTest.
classe publique RepetedTestDemo {@repeatedTest (10) void testRepeated10Times () {}}Vous pouvez également injecter une instance RepetitionInfo pour vérifier le nombre actuel de répétitions et le nombre total de répétitions.
classe publique RepetedTestDemo {@BeforeEach void avanteach (répétitionInfo info) {System.out.printf ("% d -% d / n", info.getCurrentRepetition (), info.getTotalRepetions ());} @ répété (10) Void testReated10Times () {}}Livré avec des balises
Lorsque j'ai introduit la configuration de Gradle, j'ai dit que vous pouvez choisir de filtrer certaines étiquettes dans la configuration. Il est également très simple de donner des balises dans le code, utilisez simplement @tag annotation.
@Tag ("TaggedTest") classe publique TagDemo {@Test @tag ("TaggedTest1") void testwithtag1 () {} @test @tag ("TaggedTest2") void testwithtag2 () {}}Tests imbriqués
Parfois, des tests imbriqués peuvent être nécessaires pour indiquer la relation d'inclusion entre certains tests. Les tests imbriqués utilisent l'annotation @nessée.
@DisplayName ("Test extérieur") classe publique NestEdDemo {@Test void testouter () {} @nest @displayName ("Test intérieur") classe innertestdemo {@Test void Testinner () {}}}Il convient de noter que seules les classes internes statiques peuvent utiliser des annotations imbriquées. De plus, comme Java ne permet pas aux classes internes d'avoir des méthodes statiques, il ne peut pas avoir @BeForeAll et @Afterall Annotations. Si vous souhaitez franchir cette limitation, vous devez ajouter l'annotation @Testinstance (lifeccycle.per_class) à la classe intérieure imbriquée. Pour plus de détails, veuillez vous référer au cycle de vie des instances de test.
Support IDE
Bien que Junit 5 soit sorti maintenant. Cependant, le support de diverses chaînes d'outils n'a pas continué. Actuellement, seule Intellij Idea et Eclipse 4.7 (oxygène) ont ajouté un soutien pour Junit 5. Donc, si vous êtes dans une situation formelle, il est plus sûr d'utiliser JUnit 4.
Questions fréquemment posées
Distinguer les différentes versions de l'annotation @Test
Tout comme j'écrivais cet article, j'ai rencontré un problème avec mon exemple de test. Le test n'a pas pu être passé et le message d'erreur ci-dessous s'affiche.
Échecs (1): Junit Vintage: yitian.study.test.assetiondemo: initializationError classe [classname = 'yitian.study.test.assetiondemo', fileposposition = null] => java.lang.exception: méthode testAsertion () devrait être publique
Les étudiants ayant un bon anglais devraient être en mesure de le reconnaître. Ce message d'erreur indique que la méthode de test doit être publique. Mais comme mentionné précédemment, JUnit 5 a annulé cette restriction, alors pourquoi cette erreur se produit-elle encore? J'ai regardé attentivement et j'ai trouvé l'erreur. C'est peut-être parce que JUnit 4 a été beaucoup utilisé dans le passé, donc l'IDE est par défaut à l'annotation @Test, qui est automatiquement terminée.
import org.junit.test;
Ce package est l'annotation @Test sous Junit 4. Si nous voulons utiliser Junit 5, nous avons besoin de l'annotation @Test suivante.
import org.junit.jupiter.api.test;
Après l'avoir modifié, exécutez à nouveau le test et il n'y avait en effet aucun problème. Bien sûr, dans un souci d'apprentissage et d'utilisation, je fais également référence au package Junit 4, donc ce conflit se produit. Si vous n'avez pas de besoins spéciaux, il est recommandé d'importer uniquement des forfaits JAR JAR 5 pour éviter la confusion. Bien sûr, les importations, tout va bien, mais vous devez faire attention à les distinguer et n'écrivez pas Junit 4 Annotations aux tests JUnit 5. Enfin, je vais joindre mes exemples de test. Ceux qui sont intéressés peuvent jeter un œil.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur le contenu lié à Junit5, et j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!