Pouvez-vous donner une explication simple de @TestInstance
annotation et comment elle peut être utile dans JUnit 5?
Je pense que nous pouvons obtenir le même effet probablement en rendant nos champs statiques .
Je pense que les documents fournissent un résumé utile:
Si vous préférez que JUnit Jupiter exécute toutes les méthodes de test sur la même instance de test, annotez simplement votre classe de test avec @TestInstance (Lifecycle.PER_CLASS). Lorsque vous utilisez ce mode, une nouvelle instance de test sera créée une fois par classe de test. Ainsi, si vos méthodes de test reposent sur un état stocké dans des variables d'instance, vous devrez peut-être réinitialiser cet état dans les méthodes @BeforeEach ou @AfterEach.
Le mode "par classe" présente des avantages supplémentaires par rapport au mode "par méthode" par défaut. Plus précisément, avec le mode "par classe", il devient possible de déclarer @BeforeAll et @AfterAll sur les méthodes non statiques ainsi que sur les méthodes d'interface par défaut. Le mode "par classe" permet donc également d'utiliser les méthodes @BeforeAll et @AfterAll dans les classes de test @Nested.
Mais vous l'avez probablement déjà lu et vous avez raison de penser que rendre un champ statique aura le même effet que de déclarer le champ en tant que variable d'instance et d'utiliser @TestInstance(Lifecycle.PER_CLASS)
.
Donc, peut-être que la réponse à la question "comment cela pourrait être utile dans JUnit 5" est que l'utilisation d'un @TestInstance
...
@TestInstance
est moins susceptible d'être accidentel ou résultant d'un copier-coller insensé.Cette annotation a été introduite pour réduire le nombre d'objets créés lors de l'exécution de vos tests unitaires.
L'ajout de @TestInstance(TestInstance.Lifecycle.PER_CLASS)
à votre classe de test évitera qu'une nouvelle instance de votre classe soit créée pour chaque test de la classe. Ceci est particulièrement utile lorsque vous avez beaucoup de tests dans la même classe de test et que l'instanciation de cette classe coûte cher.
Cette annotation doit être utilisée avec prudence. Tous les tests unitaires doivent être isolés et indépendants les uns des autres. Si l'un des tests change l'état od la classe de test, vous ne devez pas utiliser cette fonctionnalité.
Rendre vos champs statiques pour obtenir le même effet n'est pas une bonne idée. Cela réduira en effet le nombre d'objets créés mais ils ne peuvent pas être nettoyés lorsque tous les tests de la classe de test sont exécutés. Cela peut entraîner des problèmes lorsque vous disposez d'une suite de tests géante.
@TestInstance
est utilisé pour configurer le cycle de vie des instances de test pour la classe de test annotée ou l'interface de test:
PER_CLASS
: Une nouvelle instance de test sera créée une fois par classe de test.PER_METHOD
: Une nouvelle instance de test sera créée pour chaque méthode de test, méthode d'usine de test ou méthode de modèle de test. Ce mode est analogue au comportement des versions 1 à 4 de JUnit.Si @TestInstance
n'est pas explicitement déclaré sur une classe de test ou sur une interface de test implémentée par une classe de test, le mode de cycle de vie sera implicitement par défaut --- PER_METHOD
.
La définition du mode de cycle de vie de l'instance de test sur PER_CLASS
active les fonctionnalités suivantes:
@BeforeAll
Et @AfterAll
Non statiques de la classe de test.@BeforeAll
Et @AfterAll
Dans les classes de test @Nested
.@BeforeAll
Et @AfterAll
Sur les méthodes par défaut de l'interface.@BeforeAll
Et @AfterAll
Dans les classes de test implémentées avec le langage de programmation Kotlin.Voir la documentation test instance lifecycle pour plus de détails.