JUnit Tutoriel d'annotations avec exemple : Qu'est-ce que @Test et @After

⚡ Résumé intelligent

JUnit Les annotations sont une forme de métadonnées syntaxiques ajoutées à Java le code source afin qu'un outil d'exécution de tests sache quelles méthodes exécuter, quand les exécuter et combien de temps chacune peut prendre.

  • (I.e. @Test: Marque une méthode publique void qui JUnit s'exécute comme un cas de test unique.
  • ☑️ Cycle de la vie: @Before et @After enveloppent chaque test, tandis que @BeforeClass et @AfterClass enveloppent la classe.
  • Contrôle: @Ignore ignore un test, @Test(timeout) limite le temps d'exécution, @Test(expected) vérifie une exception levée.
  • 🧪 Affirmations : org.junit.Assert fournit assertEquals, assertTrue, assertNull, assertSame et fail().
  • Héritage: TestCase, TestResult et TestSuite appartiennent à l'ancien package junit.framework.
  • (I.e. JUnit 5: Jupiter les renomme en @BeforeEach, @AfterEach, @BeforeAll, @AfterAll et @Disabled.

JUnit Tutoriel sur les annotations : @Test, @Before et @After

Qu'est-ce que le JUnit Annotation ?

JUnit annotations sont une forme particulière de métadonnées syntaxiques qui peuvent être ajoutées à Java Le code source est annoté pour une meilleure lisibilité et une structure améliorée. Les variables, les paramètres, les packages, les méthodes et les classes peuvent être annotés. Les annotations ont été introduites dans JUnit 4, ce qui fait Java un code plus lisible et plus simple. C'est la grande différence entre JUnit 3 et JUnit 4: JUnit 4 est basé sur des annotations.

Avec une connaissance pratique de ces annotations, on peut facilement apprendre et implémenter un JUnit test. Vous trouverez ci-dessous les informations importantes et fréquemment utilisées JUnit liste des annotations, avec la JUnit 5 (Jupiter) équivalent à côté de chacun :

S.No. Annotations Description JUnit 5 équivalent
1. @Tester Cette annotation remplace junit.framework.TestCase et indique que la méthode publique void à laquelle elle est attachée peut être exécutée comme un cas de test. @Test (org.junit.jupiter.api)
2. @Avant que Cette annotation est utilisée si vous souhaitez exécuter une instruction telle que des conditions préalables avant chaque scénario de test. @AvantChaque
3. @Avant les cours Cette annotation est utilisée si vous souhaitez exécuter certaines instructions avant tous les cas de test, par exemple une connexion de test qui doit être ouverte avant tous les cas de test. @Avant tout
4. @Après Cette annotation peut être utilisée si vous souhaitez exécuter certaines instructions après chaque Cas de test, par exemple en réinitialisant des variables ou en supprimant des fichiers temporaires. @Après chaque
5. @Après les cours Cette annotation peut être utilisée si vous souhaitez exécuter certaines instructions après l'exécution de tous les cas de test, par exemple libérer des ressources après l'exécution de tous les cas de test. @Après tout
6. @Ignorer Cette annotation peut être utilisée si vous souhaitez ignorer certaines instructions lors de l'exécution des tests, par exemple en désactivant certains cas de test pendant l'exécution des tests. @Désactivée
7. @Test(délai d'attente=500) Cette annotation peut être utilisée si vous souhaitez définir un délai d'attente pendant l'exécution des tests, par exemple si vous travaillez dans le cadre d'un SLA (accord de niveau de service) et que les tests doivent être terminés dans un délai spécifié. @Timeout ou assertTimeout
8. @Test (expected = IllegalArgumentException.class) Cette annotation peut être utilisée pour gérer une exception lors de l'exécution d'un test. Par exemple, pour vérifier si une méthode particulière lève une exception spécifique. assertThrows

JUnit Exemple d'annotations

Créons une classe couvrant les sujets importants JUnit annotations avec des instructions d'impression simples et exécutez-les avec une classe d'exécution de tests :

Étape 1) Considérez ce qui suit Java classe possédant diverses méthodes qui sont associées aux annotations listées ci-dessus :

Exemple d'annotations Junit.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Étape 2) Créons une classe d'exécution de tests pour exécuter le test ci-dessus :

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

résultat attendu

  • Tous les cas de test seront exécutés un par un, et tous les messages d'affichage seront visibles sur la console.
  • Comme indiqué dans le tableau ci-dessus, @Before et @BeforeClass dans JUnit [ Les méthodes m2() et m1() ] seront exécutées respectivement avant chaque cas de test et avant tous les cas de test.
  • De la même manière que @After et @AfterClass dans JUnit Les méthodes `m4()` et `m3()` seront exécutées respectivement après chaque cas de test et après tous les cas de test. L'annotation `@Ignore` (méthode `m6()`) sera interprétée comme si le test était ignoré.

Analysons les cas de test utilisés dans ce qui précède. Java Cours en détail :

  1. Considérons la méthode m5() comme indiqué ci-dessous :
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Dans la méthode ci-dessus, vous ajoutez une chaîne de caractères à la variable « liste » :

  • liste.isEmpty() retournera faux.
  • assertFalse(list.isEmpty()) doit retourner vrai.
  • En conséquence, le scénario de test sera pass.

Comme vous n'avez ajouté qu'une seule chaîne de caractères à la liste, sa taille est de un.

  • liste.size() doit renvoyer la valeur entière « 1 ».
  • So assertEquals(1, list.size()) doit retourner vrai.
  • En conséquence, le scénario de test sera pass.
  1. Considérons la méthode m7() comme indiqué ci-dessous :
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Comme discuté ci-dessus, @Test (délai d'attente = 10) Cette fonction permet de définir un délai d'attente dans le cas de test. La valeur étant exprimée en millisecondes, la fonction m7() doit s'exécuter en moins de 10 ms.

  1. Considérons la méthode m8() comme indiqué ci-dessous :
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Comme discuté ci-dessus, @Test (attendu) La méthode vérifiera l'exception spécifiée lors de son exécution ; par conséquent, la méthode m8() lèvera une exception « Méthode inexistante ». En conséquence, le test sera exécuté avec une exception.

Note sur l'exactitude : La fonction m8() n'imprime qu'une ligne, donc l'exception déclarée n'est jamais réellement levée et JUnit 4 indique que le test a échoué. Alignez le type attendu avec le comportement de la méthode. JUnit 5 écrit ceci avec assertThrows.

Comme tous les cas de test sont réussis, cela entraîne une exécution réussie du test.

Résultat actuel

L'exemple ci-dessus comportant trois cas de test, ceux-ci seront exécutés un par un. Voir la capture d'écran de la console ci-dessous :

Eclipse Sortie de la console affichant les instructions d'impression @BeforeClass, @Before, @After et @AfterClass
Sortie console produite par JunitAnnotationsExample

Voir ci-dessous les déclarations d'impression visibles sur la console :

Utilisation de @BeforeClass , exécuté avant tous les cas de test

Utilisation des annotations @Before, exécutées avant chaque cas de test

Utilisation de @After, exécuté après chaque cas de test

Utilisation des annotations @Before, exécutées avant chaque cas de test

En utilisant @Test(timeout), il peut être utilisé pour appliquer un délai d'attente dans JUnit4 cas de tests

Utilisation de @After, exécuté après chaque cas de test

Utilisation des annotations @Before, exécutées avant chaque cas de test

En utilisant @Test (attendu), il vérifiera l'exception spécifiée lors de son exécution

Utilisation de @After, exécuté après chaque cas de test

Utilisation de @AfterClass, exécuté après tous les cas de test

JUnit Classe d'affirmation

Les annotations déterminent quand une méthode s'exécute ; les méthodes d'assertion déterminent si elle réussit.

Cette classe fournit plusieurs méthodes d'assertion utiles pour écrire un cas de test. Si toutes les assertions sont réussies, le test est considéré comme concluant. Si une seule assertion échoue, le test est considéré comme ayant échoué. JUnit affirmer Ce tutoriel aborde chaque méthode en détail.

Comme vous l'avez vu précédemment, le tableau ci-dessous décrit les principales méthodes d'assertion et leur description :

S.No. Méthode Description
1. void assertEquals (booléen attendu, booléen réel) Elle vérifie si deux valeurs sont égales, de manière similaire à la méthode equals de la classe Object.
2. void assertFalse (condition booléenne) Sa fonctionnalité consiste à vérifier qu'une condition est fausse.
3. void assertNotNull (objet objet) La fonctionnalité « assertNotNull » consiste à vérifier qu'un objet n'est pas nul.
4. void assertNull (objet objet) La fonctionnalité « assertNull » consiste à vérifier qu'un objet est nul.
5. void assertTrue (condition booléenne) La fonctionnalité « assertTrue » consiste à vérifier qu'une condition est vraie.
6. Échec nul() Si vous souhaitez déclencher une erreur d'assertion, la fonction fail() aboutit toujours à un verdict d'échec.
7. void assertSame ([String message] La fonctionnalité « assertSame » consiste à vérifier que les deux objets font référence au même objet.
8. void assertNotSame ([String message] La fonctionnalité « assertNotSame » consiste à vérifier que les deux objets ne font pas référence au même objet.

JUnit Classe de cas de test

Pour exécuter plusieurs tests, la classe TestCase est disponible dans le junit.framework package. L'annotation @Test indique JUnit que cette méthode publique void (un cas de test ici) à laquelle elle est attachée puisse être exécutée comme un cas de test.

Note de version : Cas de test, Résultat du test et Suite de tests appartenir à l'héritage junit.framework paquet de JUnit 3. Ils sont toujours inclus dans l'artefact JUnit 4.x, mais les tests basés sur des annotations n'étendent pas TestCase.

Le tableau ci-dessous présente quelques méthodes importantes disponibles dans le junit.framework.TestCase classe:

S.No. Méthode Description
1. int countTestCases() Cette méthode est utilisée pour compter le nombre de cas de test exécutés par le exécuter (TestResult tr) méthode.
2. TestResult créerResult() Cette méthode est utilisée pour créer un Résultat du test objet.
3. Chaîne getName () Cette méthode renvoie une chaîne qui n'est rien d'autre qu'un Cas de test nom.
4. Exécution du résultat du test() Cette méthode est utilisée pour exécuter un test, qui renvoie un Résultat du test objet.
5. exécution nulle (résultat TestResult) Cette méthode permet d'exécuter un test ayant un Résultat du test objet, qui ne renvoie rien.
6. void setName (nom de chaîne) Cette méthode est utilisée pour définir le nom d'un Cas de test.
7. void setup() Cette méthode est utilisée pour écrire du code d'association de ressources, par exemple pour créer une connexion à une base de données.
8. annuler le démontage() Cette méthode est utilisée pour écrire du code de libération de ressources, par exemple pour libérer une connexion à une base de données après avoir effectué une opération de transaction.

JUnit Classe TestResult

Lorsqu'un test est exécuté, il renvoie un résultat (sous la forme d'un Résultat du test Cet objet TestResult permet d'analyser l'objet résultant. Le résultat du test peut être un échec ou une réussite.

Consultez le tableau ci-dessous pour connaître les principales méthodes utilisées dans la classe junit.framework.TestResult :

S.No. Méthode Description
1. void addError (Test test, Throwable t) Cette méthode est utilisée si vous devez ajouter une erreur au test.
2. void addFailure (Test test, AssertionFailedError t) Cette méthode est utilisée si vous devez ajouter une défaillance à la liste des défaillances.
3. void endTest(Test test) Cette méthode est utilisée pour signaler qu'un test a été effectué (terminé).
4. int nombre d'erreurs() Cette méthode permet d'obtenir les erreurs détectées lors de l'exécution des tests.
5. Énumération les erreurs() Cette méthode renvoie simplement une collection (une énumération ici) d'erreurs.
6. int échecCount() Cette méthode permet d'obtenir le nombre d'échecs détectés lors de l'exécution des tests.
7. exécution annulée (test TestCase) Cette méthode est utilisée pour exécuter un scénario de test.
8. int runCount() Cette méthode se contente de compter les tests exécutés.
9. void startTest (Test test) Cette méthode est utilisée pour notifier qu'un test est démarré.
10. annuler l'arrêt() Cette méthode permet d'arrêter l'exécution du test.

JUnit Classe de suite de tests

Si vous souhaitez exécuter plusieurs tests dans un ordre précis, vous pouvez les regrouper en un seul endroit. Cet endroit s'appelle une suite de tests. JUnit suite de tests Le tutoriel présente un exemple complet.

Consultez le tableau ci-dessous pour connaître les principales méthodes utilisées dans le junit.framework.TestSuite classe:

S.No. Méthode Description
1. void addTest (Test test) Cette méthode est utilisée si vous souhaitez ajouter un test à la suite.
2. void addTestSuite(Classe classe de test) Cette méthode est utilisée si vous souhaitez spécifier la classe lors de l'ajout d'un test à la suite.
3. int countTestCases() Cette méthode est utilisée si vous souhaitez compter le nombre de cas de test.
4. Chaîne getName () Cette méthode est utilisée pour obtenir le nom de la suite de tests.
5. exécution nulle (résultat TestResult) Cette méthode est utilisée pour exécuter un test et recueillir le résultat du test dans un Résultat du test objet.
6. void setName (nom de chaîne) Cette méthode est utilisée pour définir le nom du Suite de tests.
7. Test testAt (index int) Cette méthode est utilisée si vous souhaitez renvoyer le test à un index donné.
8. int testCount() Cette méthode est utilisée si vous souhaitez obtenir le nombre de tests dans la suite.
9. Avertissement de test statique (message de chaîne) Cette méthode renvoie un test qui échouera et enregistrera un message d'avertissement.

FAQ

Oui. Une méthode comporte généralement l'annotation `@Test` associée à `@Ignore`, ou `@Test` avec un délai d'attente et une exception attendue. Il est impossible de cumuler deux annotations de cycle de vie, telles que `@Before` et `@After`, sur une même méthode.

@Ignore supprime uniquement une méthode JUnit Il est déjà reconnu comme un test. Sans l'annotation `@Test`, le lanceur ne collecte jamais la méthode ; elle n'est donc ni exécutée ni considérée comme ignorée.

JUnit La méthode est exécutée sur un thread séparé et échoue avec une exception TestTimedOutException une fois le budget écoulé. Le thread est interrompu, et non arrêté ; un appel bloquant peut donc continuer à s'exécuter.

Uniquement via le moteur vintage. L'ajout de junit-vintage-engine permet JUnit La plateforme exécute les tests org.junit existants sans modification, mais les tests Jupiter doivent importer org.junit.jupiter.api. Mélanger les deux ensembles d'importation dans une même classe provoque une erreur.

Uniquement pour la maintenance. Les suites de tests héritées qui étendent TestCase et créent des objets TestSuite restent courantes dans les anciens codes sources ; il est donc utile de connaître l’API. Les nouveaux tests doivent être basés sur des annotations.

JUnit Une nouvelle instance de la classe de test est créée pour chaque méthode de test, de sorte qu'aucune n'existe lors de l'exécution de la configuration au niveau de la classe. Une méthode statique ne nécessite pas d'instance. JUnit rejette une déclaration non statique.

Les assistants IA analysent la méthode testée et indiquent si la configuration doit être placée dans @Before ou @BeforeClass, et si un cas d'échec nécessite @Test(expected) ou assertThrows. Considérez chaque suggestion comme une ébauche.

Copilote GitHub L'installation et le démontage se font généralement correctement, mais cela mélange fréquemment les deux. JUnit 4 et Jupiter sont importés dans un seul fichier. Vérifiez le bloc d'importation avant d'exécuter la suite.

Résumez cet article avec :