Comment assurez-vous TestNG pistes de méthodes sur les classes de test dans la succession au lieu de entrelacés?
La situation et le problème
J'ai plusieurs classes de test, chacun avec plusieurs méthodes de test. Tous les tests utilisent la même base de données de test dans le fond. Chaque classe de test initialise son contenu de base de données, puis les tests de choses dans plusieurs méthodes d'essai.
Quand je lance chaque test individuellement, ils passent tous. Mais quand je lance plusieurs tests en même temps (soit à l'aide de maven ou mon IDE, Ide), les méthodes de différentes classes de test sont exécutés entrelacés, par exemple. l'initialisation de la base de la seconde classe s'exécute après le premier de la classe a commencé, mais avant toutes les méthodes d'essai de première classe ont été exécutés afin que ces méthodes échouent (car la base de données contient déjà deuxième de la classe de données).
Certaines choses que j'ai essayé, et un peu plus de détails
La solution la plus simple serait d'obliger les TestNG coureur à courir classes de la succession (c'est à dire. attendez que toutes les méthodes de test d'une classe de test avant la fin de l'exécution de tester des méthodes d'une autre classe). Cela peut-il être fait?
Je peux probablement le faire en spécifiant chaque classe de test dans mon bureau, mais je ne veux pas faire ce que j'aurais à ajouter quelque chose à la suite à chaque fois que j'ajoute une classe de test qui est maladroit et sujette à erreur.
Suffit de demander à TestNG pour ne pas paralléliser quoi que ce soit (par exemple. réglage du nombre de threads pour 1 ou la désactivation de fonctionnement en parallèle) n'aide pas ici puisque les méthodes obtenez toujours courir dans le mauvais ordre (mais pas simultanément).
Une option serait d'utiliser une base de données différente pour chaque classe de test, mais je ne vois pas de moyen simple de le faire (en utilisant JPA, et Guice).
Je ne suis pas actuellement à l'aide de DBUnit, Unitils etc.; Je ne connaissais pas ces outils très bien, mais j'ai l'impression de ne pas résoudre mes problèmes.
Je suis en utilisant JPA pour initialiser la base de données dans chaque classe de test (c'est à dire. créer des objets de l'entité et presist eux).
- Je pense qu'au moins une partie du problème est que plusieurs classes ont des méthodes appelées
testPrepareDb
et d'autres méthodes annotées@Test(dependsOnMethods = "testPrepareDb")
. Lorsque plusieurs de ces classes sont exécutées dans le cadre d'un test, il semble que tous les dépendants méthodes sont exécutées qu'après que tous lestestPrepareDb
méthodes ont été exécutés, ce qui est faux dans mon cas. En gros, j'avais juste envie de mes classes de test pour traduire automatiquement pour séparer TestNG tests sans avoir à indiquer explicitement comme<test>
dans la suite de l'xml.
Vous devez vous connecter pour publier un commentaire.
Même en mode séquentiel TestNG pourrait intercaler les méthodes d'essai à partir de la même suite. Il ne garantit la séquence @BeforeClass -> @Test -> @AfterClass mais il peut faire quelque chose comme:
La solution est de forcer chaque classe dans une autre suite (qui sont exécutés vraiment de manière séquentielle). À partir de la version 2.16, le maven plugin surefire met chaque classe dans une suite séparée de sorte que le problème est résolu.
D'autre part, l'IDÉE (même les derniers 13 PAE) génère un fichier xml avec toutes les classes dans la même suite. Espérons que l'IDÉE sera de suivre et de corriger cela aussi. Interleaved tests sont un obstacle de taille lorsque l'on travaille avec des ressources communes, telles que des bases de données.
venu ici avec un problème similaire. Je pense que le groupe-par-cas="true" pourrait être une solution.
TestNG propose plusieurs stratégies parallèles. Il ressemble à
methods
est trop agressif pour vos besoins, mais avez-vous regardéclasses
ou peut-êtreinstances
?false
avant; maintenant, j'ai essayémethods
,classes
ettests
trop (instances
ne semble pas être une option valide). Aucun aide. Comme je l'ai écrit, le problème n'est pas de parallélisation, c'est de la commande.J'ai écrit un article à discuter de certaines façons de séquence de tests en TestNG:
http://ancient-marinator.blogspot.com/2013/05/on-testing-scheduling-your-tests.html
Naturellement, la meilleure source d'information est à la maison: http://testng.org/doc/index.html
@Test(groups="test1")
au début de la première classe,@Test(groups="test2",dependsOnGroups="test1")
, etc, pour chaque classe dans l'ordre. Cela va sérialiser le cours d'exécution sur une classe de base.Utilisation méthode d'intercepteurs (=écrire et de permettre un personnalisé) à la commande.
Aussi, chaque classe peut utiliser sa propre base de données sandbox: emballage de chaque classe de test dans une transaction pourrait éventuellement vous aider.
Avoir individuelle suffixe pour les tableaux/db mis en place pour chaque catégorie serait même laissez vos méthodes de test s'exécuter en parallèle (je suppose que les deux premières options ne seraient pas).
Je ne voudrais pas utiliser dependsOnGroups au niveau de la classe, parce que si aucune méthode de test dans les catégories qui vous êtes en fonction échoue, elle ne fonctionnera pas votre classe à tous... C'est le véritable inconvénient de l'utilisation de 'dependsOn groupes (ou les méthodes). Je voudrais essayer d'abord juste paramètre @Test(groupe = thisClassName) au niveau de la classe, puis d'identifier la classe avec un test de la balise dans votre testng.xml fichier. Ensuite, la commande de votre classe s'exécute dans le xml comme une liste de ces tests. Je crois que vous pouvez aussi avoir besoin de définir PreserveOrder = "True" sur le niveau supérieur suivant dans la balise xml. Je voudrais éviter d'utiliser dependsOn sauf quand vous en avez vraiment besoin de dépendances, mais pas pour le contrôle de la commande. Espérons que cette aide. -JR
Nous avons été en cours d'exécution dans ce même numéro, la plupart des gens disent que c'est causé par l'utilisation de dependsOn, mais notre solution était tout simplement de la définition des priorités à un test de niveau pour certains de nos tests. J'ai mis en place un Test Auditeur à re-donner la priorité à nos tests afin qu'ils s'exécutent dans l'ordre correct. Ceci est basé sur saberduck une solution de
https://github.com/cbeust/testng/issues/106
Cette solution permettra de conserver la priorité de test en ajoutant à la classe de priorité.
Aussi, vous aurez besoin d'ajouter l'écouteur à votre testng.xml