JUnit vs TestNG
Au travail, nous utilisons toujours JUnit 3 pour exécuter nos tests. Nous envisageons de passer à JUnit 4 pour les Nouveaux tests en cours d'écriture, mais je garde un œil sur TestNG depuis un moment maintenant. Quelles expériences avez-vous tous eues avec JUnit 4 ou TestNG, et qui semble mieux fonctionner pour un très grand nombre de tests? Avoir la flexibilité dans l'écriture des tests est également important pour nous puisque nos tests fonctionnels couvrent un aspect large et doivent être écrits de diverses façons pour obtenir des résultats.
Les anciens tests ne seront pas réécrits car ils font très bien leur travail. Ce que je voudrais voir dans les nouveaux tests, c'est la flexibilité dans la façon dont le test peut être écrit, les assertions naturelles, le regroupement et les exécutions de test facilement distribuées.
13 réponses
J'ai utilisé les deux, mais je dois convenir avec Justin Standard que vous ne devriez pas vraiment envisager de réécrire vos tests existants dans un nouveau format. Quelle que soit la décision, il est assez trivial d'exécuter les deux. TestNG s'efforce d'être beaucoup plus configurable que JUnit, mais à la fin, ils fonctionnent tous les deux aussi bien.
TestNG a une fonctionnalité intéressante où vous pouvez marquer les tests comme un groupe particulier, puis exécuter facilement tous les tests d'un groupe spécifique, ou exclure les tests d'un groupe particulier. Ainsi, vous peut marquer les tests qui s'exécutent lentement comme dans le groupe" lent", puis les ignorer lorsque vous voulez des résultats rapides. Une suggestion de leur documentation est de marquer un sous-ensemble comme des tests "checkin" qui devraient être exécutés chaque fois que vous vérifiez de nouveaux fichiers. Je n'ai jamais vu une telle fonctionnalité dans JUnit, mais là encore, si vous ne l'avez pas, vous ne le manquez pas vraiment.
Pour toutes ses revendications de configuration élevée, j'ai rencontré un cas de coin il y a quelques semaines où je ne pouvais pas faire ce que je voulais faire... Je souhaite que je je me souviens de ce que c'est, mais je voulais en parler pour que tu saches que ce n'est pas parfait.
Le plus grand avantage de TestNG est les annotations... ce que JUnit a ajouté dans la version 4 de toute façon.
D'abord, je dirais, ne réécrivez pas tous vos tests juste pour répondre à la dernière mode. Junit3 fonctionne parfaitement bien, et l'introduction des annotations dans 4 Ne vous achète pas beaucoup (à mon avis). Il est beaucoup plus important que vous les gars Écrire tests, et il semble que vous faites.
Utilisez ce qui semble le plus naturel et vous aide à faire votre travail.
Je ne peux pas commenter TestNG b / C Je ne l'ai pas utilisé. Mais je recommanderais unitils , un excellent wrapper pour JUnit / TestNG / DBUnit / EasyMock, quel que soit l'itinéraire que vous prenez. (Il supporte toutes les saveurs mentionnées ci-dessus)
Il y a environ un an, nous avons eu le même problème. J'ai passé quelque temps à considérer quel mouvement était le meilleur, et finalement nous avons réalisé que TestNG n'a pas de "caractéristiques tueuses". C'est agréable, et a quelques fonctionnalités que JUnit 4 n'a pas, mais nous n'en avons pas besoin.
Nous ne voulions pas que les gens se sentent mal à l'aise d'écrire des tests tout en apprenant à connaître TestNG parce que nous voulions qu'ils continuent à écrire beaucoup de tests.
En outre, JUnit est à peu près la norme de facto dans le monde Java. Il n'y a pas d'outil décent qui ne supporte pas de la boîte, vous pouvez trouver beaucoup d'aide sur le web et ils ont ajouté beaucoup de nouvelles fonctionnalités au cours de la dernière année qui montre qu'il est vivant.
Nous avons décidé de rester avec JUnit et n'avons jamais regardé en arrière.
Les plus grandes cartes de tirage de TestNG pour moi incluent ses groupes de test de support, et plus important encore-les dépendances de groupe de test (marquer un test comme dépendant d'un groupe fait simplement sauter les tests lorsque le groupe dépendant échoue).
Les autres cartes big draw de TestNG pour moi incluent les paramètres de test, les fournisseurs de données, les transformateurs d'annotation et, plus que tout, la communauté d'utilisateurs dynamique et réactive.
En surface, on pourrait ne pas penser à tous les TestNGs caractéristiques ci-dessus pourraient ne pas être nécessaires, une fois que vous commencez à comprendre la flexibilité apporter à vos tests, vous vous demanderez comment vous avez fait face à JUnit.
(avertissement-je n'ai pas utilisé JUnit 4.x du tout, donc je ne peux pas vraiment commenter les avancées ou les nouvelles fonctionnalités là-bas).
Bravo à tout ce qui précède. D'autres choses que j'ai personnellement trouvées que J'aime plus dans TestNG sont:
Le
@BeforeClass
pour TestNG a lieu après la création de la classe, de sorte que vous n'êtes pas contraint de pouvoir appeler uniquement des méthodes statiques de votre classe.Des tests parallèles et paramétrés, peut-être que je n'ai pas assez de vie... mais je reçois juste un coup de pied en écrivant un ensemble de tests de sélénium, en acceptant un nom de pilote comme paramètre. Définir ensuite 3 groupes de test parallèles, 1 chacun pour les pilotes IE, FF et Chrome, et regarder la course! J'ai initialement fait 4, mais beaucoup trop de pages sur lesquelles j'ai travaillé cassent le pilote
HtmlUnit
pour une raison ou une autre.
Ouais, probablement besoin de trouver cette vie. ;)
, je voulais partager celui que j'ai rencontré aujourd'hui. J'ai trouvé que le runner paramétré intégré est assez brut dans Junit4 comme comparé à TestNG (je sais que chaque framework a ses forces mais quand même). L'annotation Junit4 @ parameters est limitée à un ensemble de paramètres. J'ai rencontré ce problème lors du test du comportement valide et invalide pour la fonctionnalité dans la même classe de test. Ainsi, la première méthode annotée publique et statique qu'elle trouve sera utilisée, mais elle peut les trouver dans n'importe quel ordre. Cela nous cause pour écrire différentes classes inutilement. Cependant TestNG fournit propre façon de fournir différents types de fournisseurs de données pour chaque méthode. Ainsi, nous pouvons tester la même unité de code avec une manière valide et invalide dans la même classe de test en mettant les données valides/invalides séparément. Je vais aller avec TestNG.
Un autre avantage de TestNG est le soutien des tests parallèles. Dans notre ère de multicores, c'est important, je pense.
J'ai également utilisé les deux frameworks. Mais j'utilise hamcrest pour les assertations. Hamcrest vous permet d'écrire facilement votre propre méthode assert. Donc, au lieu de
assertEquals(operation.getStatus(), Operation.Status.Active);
Vous pouvez écrire
assertThat(operation, isActive());
Cela vous donne la possibilité d'utiliser un niveau d'abstraction plus élevé dans vos tests. Et cela rend vos tests plus robustes.
Quelques ajouts à la réponse de Mike Stone:
1) la chose la plus fréquente pour laquelle j'utilise les groupes de TestNG est quand je veux exécuter une seule méthode de test dans une suite de tests. J'ajoute simplement ce test au groupe "phil" et lance ensuite ce groupe. Quand j'utilisais JUnit 3, je commentais les entrées pour toutes les méthodes, mais celle que je voulais exécuter dans la méthode" suite", mais j'oubliais généralement de les décommenter avant de les vérifier. Avec les groupes, je n'ai plus ce problème.
2) En fonction de la complexité des tests, la migration des tests de JUnit3 vers TestNG peut être effectuée automatiquement avec sed et la création d'une classe de base pour remplacer TestCase qui importe static toutes les méthodes assert de TestNG.
J'ai des informations sur ma migration de JUnit à TestNG ici et ici .
JUnit 4 Vs TestNG-comparaison par mkyong.com (mis à jour en 2013).
Conclusion: je suggère d'utiliser TestNG comme framework de test unitaire de base pour le projet Java, car TestNG est Plus avance dans les tests de paramétrage, les tests de dépendance et les tests de suite (concept de regroupement).
TestNG est destiné aux tests fonctionnels de haut niveau et aux tests d'intégration complexes. Sa flexibilité est particulièrement utile avec les grandes suites de test.
En outre, TestNG aussi couvrir toute la fonctionnalité Core JUnit4 . Ce n'est plus une raison pour que J'utilise JUnit.
In simple terms, TestNG = JUnit + lot more...So, Why debate ? go and grab TestNG :-)
Vous pouvez trouver une comparaison plus détaillée ici .
J'aime l'intégration soignée et facile de TestNG avec Guice.
Votre question me semble deux fois pliée. D'une part vous voulez comparer deux frameworks de test, d'autre part, vous souhaitez mettre en œuvre des tests facilement, naturel affirmations, etc...
Ok, tout d'abord JUnit a joué catchup avec TestNG en termes de fonctionnalité, ils ont comblé l'écart avec v4, mais pas assez bien à mon avis. Des choses comme les annotations et les fournisseurs de données sont encore beaucoup mieux dans TestNG. En outre ils sont plus flexibles en termes d'exécution de test, depuis TestNG a la dépendance de test, le regroupement et l'ordre.
JUnit nécessite toujours que certaines méthodes avant / après soient statiques, ce qui limite ce que vous pouvez faire avant l'exécution des tests, TestNG n'a jamais ce problème.
TBH, la plupart du temps les différences entre les deux frameworks ne signifient pas grand-chose, sauf si vous vous concentrez sur les tests d'intégration/automatisation. JUnit de mon expérience est construit à partir du sol pour les tests unitaires et est maintenant poussé vers des niveaux plus élevés de tests, qui IMO en fait le mauvais outil pour le travail. TestNG fait bien au test unitaire et en raison de ses capacités robustes de dataproviding et d'exécution de test, fonctionne encore mieux au niveau du test d'intégration/automatisation.
Maintenant, pour ce que je crois être un problème distinct, comment écrire des tests bien structurés, lisibles et maintenables. La plupart de cela, je suis sûr que vous le savez, mais des choses comme modèle D'usine, Command Pattern et PageObjects (si vos sites de test) sont vitaux, c'est très important d'avoir une couche d'abstraction entre ce que votre test (SUT) et ce qu'est le test réel (assertions de logique métier). Pour avoir des assertions beaucoup plus agréables, vous pouvez utiliser Hamcrest . Utilisez l'héritage/les interfaces javas pour réduire la répétition et appliquer la communauté.
Presque oublié, utilisez également le modèle Test Data Builder , ceci couplé à l'annotation dataprovider de TestNG est très utile.
Mon opinion sur ce qui rend TestNG vraiment beaucoup plus puissant:
1. JUnit still requires the before/after class methods to be static, which limits
what you can do prior to the running of tests, TestNG never has this issue.
2. TestNG @Configuration methods can all take an optional argument to their
annotated methods in the form of a ITestResult, XmlTest, Method, or
ITestContext. This allows you to pass things around that JUnit wouldn't
provide you. JUnit only does this in listeners and it is limited in use.
3. TestNG comes with some pre-made report generation classes that you can copy
and edit and make into your own beautiful test output with very little
effort. Just copy the report class into your project and add a listener
to run it. Also, ReportNG is available.
4. TestNG has a handful of nice listeners that you can hook onto so you can do
additional AOP style magic at certain phases during testing.
Pourquoi utilisons-nous TestNG au lieu de JUnit?
La déclaration de la méthode
@BeforeClass
et@AfterClass
doit être statique dans JUnit alors qu'il y a plus de flexibilité dans TestNG dans la déclaration de méthode, elle n'a pas ces contraintes.-
Dans TestNG, nous pouvons paramétrer les tests en utilisant 2 façons . @Paramètre ou @ DataProvider annotation.
I) @ Parameter pour les cas simples, où le mappage des valeurs clés est requis.(les données sont fournies par xml fichier)
Ii) @DataProvider pour les cas complexes. En utilisant 2 dimensions tableau, il peut fournir des données.
Dans TestNG, puisque la méthode @ DataProvider n'a pas besoin d'être statique, nous pouvons utiliser plusieurs méthodes de fournisseur de données dans la même classe de test.
Test de dépendance: dans TestNG, si le test initial échoue, tous les tests dépendants suivants seront ignorés, et non marqués comme ayant échoué. Mais JUnit a marqué son échec.
Groupement: Unique les tests peuvent appartenir à plusieurs groupes, puis s'exécuter dans différents contextes (comme les tests lents ou rapides). Une fonctionnalité similaire existe dans les catégories JUnit, mais il manque les annotations @BeforeGroups / @AfterGroups TestNG qui permettent d'initialiser le test / de le détruire.
Parallelism: Si vous souhaitez exécuter le même test en parallèle sur plusieurs threads, TestNG vous a couvert d'une annotation simple à utiliser alors que JUnit n'offre pas un moyen simple de le faire boîte.
TestNG @ DataProvider peut également prendre en charge XML pour alimenter des données, des fichiers CSV ou même des fichiers texte.
TestNG vous permet de déclarer des dépendances entre les tests et de les ignorer si le test de dépendance n'a pas réussi.
@ Test (dependsOnMethods = {"dependOnSomething"})
Cette fonctionnalité n'existe pas dans JUnit
- Rapports:
Les rapports TestNG sont générés par par défaut à un dossier de sortie de test qui inclut des rapports HTML avec toutes les données de test, passé / échoué/ignoré, combien de temps ont-ils couru, quelle entrée a été utilisée et les journaux de test complets. En outre, il exporte également tout dans un fichier XML qui peut être utilisé pour construire votre propre modèle de rapport.
Sur le front JUnit, toutes ces données sont également disponibles via XML, mais il n'y a pas de rapport prêt à l'emploi et vous devez vous fier aux plugins.
Lien De Ressource:
Une bonne différence est donnée dans ce tutoriel côte à côte: TestNG Vs JUnit: Quelle est la différence?