Dois-je utiliser les mêmes variables à travers l'ensemble de l'Unité de Test?

0

La question

Je suis la création de Tests Unitaires en Java et pour chaque méthode, j'ai créer les mêmes listes, variables, etc. D'autre part, bien sûr, j'ai pensé que je pouvais créer de toutes ces variables globales et de définir leurs valeurs dans l' setup() méthode (en @Before), mais je ne suis pas sûr si les valeurs peuvent être modifiées lors de l'exécution de tests en raison de multithreading, etc. Alors, quelle est la meilleure façon pour ce genre de situation?

java junit junit5 testing
2021-11-23 13:33:22
1

La meilleure réponse

2

Rien à craindre. JUnit va créer une nouvelle instance de votre classe de test, puis exécutez chaque @Before méthode, et seulement ensuite, exécutez l' @Test méthode, et il le fait de la chanson et de la danse de routine tout recommencer pour chaque @Test méthode annotée dans cette classe. Vous êtes à l'aide de @Before exactement ce qui était prévu: C'est pour stocker le code d'initialisation qui est requis pour tous les tests dans la classe de test.

JUnit est-il de cette façon parce que test "d'indépendance" est agréable d'avoir: des Tests, de préférence, d'échouer ou de passer indépendant de l'ordre dans lequel vous les exécuter.

Chaque si souvent le processus init est tellement cher que c'est pas la peine de payer le coût de l'exécution et recommencer pour chaque test. L'annotation @BeforeClass existe spécialement pour cette fin. La javadoc de @BeforeClass même les sorts que cela compromet test d'indépendance et doit donc être utilisé uniquement si le programme d'installation de travail que vous faites au sein d'une telle méthode est assez coûteuse (en termes de calcul ou autre) pour faire cette différence.

En d'autres termes:

Vos inquiétudes au sujet du test d'indépendance sont réels, mais ils s'appliquent à @BeforeClass. @Before ne souffre pas de ce problème; ce code est ré-exécutée pour chaque test.

NB: Vous pouvez mélanger tout cela par la fenêtre si vous avez static choses qui se passent. N'ont pas statique des trucs dans le code de test, sauf si vous savez vraiment ce que vous faites. Je suppose que vous n'avez pas que dans ce cas - porter sur, vos tests sont indépendants.

2021-11-23 13:38:26

Merci beaucoup, un exemple de code qui montrent l'utilisation correcte?
rzwitserloot

Je n'ai pas compris la différence entre @BeforeClass et @Before. Toute clarification pls?
Amadán

toutes les méthodes avec @Before sont exécutées avant chaque test. Toutes les méthodes avec @BeforeClass sont exécutées qu'une seule fois, avant tout essai. En général, vous définissez static des trucs avec @BeforeClass qui est ensuite ré-utilisé (donc, les tests ne sont plus indépendants). Vous définissez non-statique des trucs avec @Beforeet donc les tests sont indépendants. Il suffit de lire la doc de ces annotations.
rzwitserloot

@BeforeClass (JUnit 5: @BeforeAll) exécute une seule fois pour l'ensemble de la classe de test, @Before (JUnit 5: @BeforeEach) est exécutée avant chaque méthode de test.
rzwitserloot

J'utilise JUnit5, alors que je vois la différence entre @BeforeEach vs @BeforeAll eh bien à partir de vos explications. Cependant, je ne suis pas sûr si je devrais ou ne pas effacer les listes qui sont utilisés par de multiples essais. J'ay besoin de le vider dans @AfterEach. Une idée?
avandeursen

Ne pas effacer la liste. On dirait également que vous devez jouets avec cela, un peu, parce que de toute évidence une SORTE de réponse n'est pas suffisant pour vous. C'est un bon instinct! Juste.. faire quelques tests, ajouter des éléments à une liste initialisé qu'une seule fois dans @Beforeet imprimer quelques trucs - sans rien enlever. Ensuite, il suffit d'observer ce qui se passe.

Oui, il pouvait être joué, mais je pense que c'est un très commun de la situation et il doit y avoir une approche générale pour que. Donc, j'ai juste besoin d'être clarifié au sujet de l'Unité de Test convention pour ré-utiliser les mêmes variables (par exemple la définition d'une fois dans @BeforeEach OU @BeforeAll, effacer les variables sur @AfterEach. Alors, qu'est-ce que l'approche appropriée pour cette situation?. Une idée?

Utilisation @Before. Je n'ai aucune idée de ce que pourrait être encore en train de vous confondre à ce point. La réponse des sorts ça!

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................