web-dev-qa-db-fra.com

À quoi sert l'annotation @TestInstance dans JUnit 5?

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 .

13
Mahozad

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 ...

  • Est explicite sur vos intentions. On pourrait supposer que l'utilisation du mot clé statique était accidentelle alors que l'utilisation de @TestInstance est moins susceptible d'être accidentel ou résultant d'un copier-coller insensé.
  • Délègue la responsabilité de gérer la portée et le cycle de vie et de nettoyer le cadre plutôt que d'avoir à se rappeler de gérer cela vous-même.
11
glytching

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.

5
dyVeloper

@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:

  • État d'instance de test partagé entre les méthodes de test d'une classe de test donnée ainsi qu'entre les méthodes @BeforeAll Et @AfterAll Non statiques de la classe de test.
  • Déclaration des méthodes @BeforeAll Et @AfterAll Dans les classes de test @Nested.
  • Déclaration de @BeforeAll Et @AfterAll Sur les méthodes par défaut de l'interface.
  • Déclaration simplifiée des méthodes @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.

4
cassiomolin