Comment partager JUnit BeforeClass logique entre plusieurs classes de test
Actuellement, tous mes tests JUnit étendre à partir d'une classe de base commune qui fournit des méthodes taggés avec @BeforeClass
et @AfterClass
annotations - tous ces vraiment faire est de configurer un tas de ressources statiques/services pour les tests à utiliser.
Cela semble un maladroit pour moi pour plusieurs raisons:
- Partie du point de JUnit4 (à partir de ma compréhension), c'est que nous ne devrions pas besoin de ce classique de tester l'héritage plus.
- Quand j'ai de l'exécution de ces tests dans le cadre d'une suite plutôt qu'individuellement (qui nous le font souvent), le
@BeforeClass
et@AfterClass
appelé à de multiples reprises, le ralentissement de la teste - nous vraiment ne doit être l'appel de ces une fois
Ce que je voudrais faire est en quelque sorte la BeforeClass/AfterClass la logique de la chaîne d'héritage et en quelque chose qui peut être partagé par les différents tests et de la série dans son ensemble.
Cela peut-il être fait? Si oui, comment? (Si c'est important, je suis en utilisant JUnit 4.7, et il pourrait être difficile à vendre à la mise à jour d'une version différente)
Vous devez vous connecter pour publier un commentaire.
Une solution au premier problème est de passer de la logique dans une extension de
org.junit.rules.ExternalResource
accroché à l'essai par l'intermédiaire d'un@ClassRule
, introduit dans JUnit 4.9:De cette façon, les ressources précédemment gérés par la classe de base sont déplacés hors de la classe de test de la hiérarchie et en plus modulaire/consommables "ressources" qui peuvent être créés avant une classe fonctionne et détruits après une classe fonctionne.
Que pour résoudre ces deux problèmes en même temps, c'est à dire: avoir le même niveau élevé de l'installation/démontage exécuter en tant que partie d'un test individuel et en tant que partie d'un ensemble - il ne semble pas être spécifique construit en soutien à ce projet. Cependant..., vous pourriez mettre en œuvre vous-même:
Il suffit de modifier le
@ClassRule
de création de ressources dans une usine modèle qui fait le comptage de référence interne pour déterminer si ou de ne pas créer/détruire la ressource.Par exemple (notez que c'est rugueux et pourraient avoir besoin de quelques réglages/gestion des erreurs pour la robustesse):
À la fois votre suite de tests /classes suffit d'utiliser la ressource en tant que
@ClassResource
par le biais de la méthode de fabrique:Lors de l'exécution d'un test, les compteurs refcount n'aura aucun effet - le "init" et la "permutation" ne sera possible une fois. Lors de l'exécution par la suite, la suite va créer le TestResource, et les tests individuels va réutiliser le déjà instantated un (les compteurs refcount l'empêche d'être réellement détruit et recréé entre les tests dans la suite).
ClassRule
. Chaque test va changer refCount à 2, puis de nouveau à 1 quand il est fait. Lorsque la suite est fait, il va aller à 0. Lors de l'exécution d'un test refCount est mis à 1 par le test, puis à 0 lorsque le test est terminé. Le point est que la ressource n'est créé et détruit une fois dans les deux sens de marche.Vous pouvez utiliser le
@BeforeClass
et@AfterClass
DANS LA SUITE de la CLASSE.Cela permettra d'exécuter les méthodes avant tout les classes de test dans la suite de l'exécution et après toutes les classes de test finition (respectivement)
De cette façon, vous pouvez exécuter qu'une seule fois.
Je suis tombé sur le même problème (Printemps n'était pas une option et je ne suis pas d'écrire des tests dans des projets maven) j'ai donc écrit simple runner junit pour résoudre ce problème.
Vous avez besoin d'écrire SharedResource la classe et la marque de votre test d'exiger que des ressources.
}
Sources à https://github.com/eanlr/junit-shared-resources-runner