JUnit vs TestNG

Au travail, nous utilisons toujours JUnit 3 pour exécuter nos tests. Nous avons envisagé de passer à JUnit 4 pour les nouveaux tests en cours de rédaction, mais je surveille TestNG depuis un moment. Quelles expériences avez-vous toutes avec JUnit 4 ou TestNG, et qui semble mieux fonctionner pour un très grand nombre de tests? Avoir de la souplesse dans la rédaction des tests est également important pour nous, car nos tests fonctionnels couvrent un large aspect et doivent être rédigés de différentes manières pour obtenir des résultats.

Les anciens tests ne seront pas réécrits car ils font leur travail correctement. Ce que je souhaiterais voir dans de nouveaux tests, cependant, c’est la flexibilité de la manière dont le test peut être écrit, les assertions naturelles, le regroupement et les exécutions de test faciles à dissortingbuer.

    J’ai utilisé les deux, mais je suis d’accord avec Justin Standard sur le fait que vous ne devriez pas vraiment envisager de réécrire vos tests existants dans un nouveau format. Indépendamment de la décision, il est assez banal de faire les deux. TestNG s’efforce d’être beaucoup plus configurable que JUnit, mais au final, ils fonctionnent tous les deux aussi bien.

    TestNG a une fonctionnalité intéressante qui vous permet de marquer des tests en tant que groupe particulier, puis d’exécuter facilement tous les tests d’un groupe spécifique ou d’exclure les tests d’un groupe particulier. Ainsi, vous pouvez marquer les tests qui se déroulent lentement comme dans le groupe “lent”, puis les ignorer lorsque vous souhaitez obtenir des résultats rapides. Une suggestion de leur documentation est de marquer certains sous-ensembles comme des tests “checkin” qui doivent être exécutés chaque fois que vous vérifiez de nouveaux fichiers. Je n’ai jamais vu une telle fonctionnalité dans JUnit, mais encore une fois, si vous ne l’avez pas Il me manque vraiment.

    Pour toutes ses affirmations de configuration élevée, j’ai rencontré une valise de coin il y a quelques semaines, où je ne pouvais pas faire ce que je voulais faire … J’aimerais pouvoir me souvenir de ce que c’est, mais je voulais en parler alors vous savez que ce n’est pas parfait.

    Le plus grand avantage de TestNG réside dans les annotations … que JUnit a de toute façon ajoutées à la version 4.

    Tout d’abord, je dirais que ne réécrivez pas tous vos tests uniquement pour les dernières tendances. Junit3 fonctionne parfaitement, et l’introduction d’annotations dans 4 ne vous achète pas beaucoup (à mon avis). Il est beaucoup plus important que vous écriviez des tests, et cela vous semble bien.

    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, quelle que soit la route 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’avait pas de «fonctionnalités hors pair». C’est bien, et il y a quelques fonctionnalités que JUnit 4 n’a pas, mais nous n’en avons pas besoin.
    Nous ne voulions pas que les gens éprouvent des difficultés à écrire des tests tout en apprenant à connaître TestNG, car nous voulions qu’ils continuent à écrire beaucoup de tests.
    De plus, JUnit est à peu près la norme de facto dans le monde Java. Il n’y a pas d’outil décent qui ne le supporte pas, 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, ce qui montre qu’il est vivant.

    Nous avons décidé de restr avec JUnit et jamais regardé en arrière.

    Parmi les cartes de tirage les plus importantes de TestNG, citons les groupes de tests de support et, plus important encore, les dépendances des groupes de test (le fait de marquer un test comme dépendant d’un groupe fait que les tests sont simplement ignorés lorsque le groupe dépendant échoue).

    Parmi les autres cartes de tirage de TestNG, citons les parameters de test, les fournisseurs de données, les transformateurs d’annotation et plus que tout – la communauté d’utilisateurs dynamic et réactive.

    En surface, on ne pense peut-être pas que toutes les fonctionnalités de TestNG ci-dessus peuvent ne pas être nécessaires. Une fois que vous aurez compris la flexibilité apscope à vos tests, vous vous demanderez comment vous avez géré JUnit.

    (avertissement – Je n’ai pas utilisé JUnit 4.x, donc je ne peux pas vraiment commenter les avancées ou les nouvelles fonctionnalités).

    Bravo à tout ce qui précède. Certaines des autres choses que j’ai trouvées personnellement dans TestNG sont:

    1. Le @BeforeClass pour TestNG a lieu après la création de la classe, vous n’êtes donc pas limité par la possibilité d’appeler des méthodes statiques de votre classe.

    2. Des tests parallèles et paramétrés, peut-être que je n’ai pas assez de vie… mais j’ai juste un coup de pied pour écrire une série de tests Selenium, en acceptant un nom de pilote comme paramètre. Puis définissez 3 groupes de tests parallèles, 1 chacun pour les pilotes IE, FF et Chrome, et regardez la course! Au départ, je faisais 4, mais beaucoup de pages sur HtmlUnit j’ai travaillé ont brisé 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 grossier dans Junit4 par rapport à TestNG (je sais que chaque framework a ses points forts mais quand même). L’annotation Junit4 @parameters est limitée à un ensemble de parameters. J’ai rencontré ce problème lors du test du comportement valide et non valide pour la fonctionnalité dans la même classe de test. Ainsi, la première méthode annotée statique et publique trouvée sera utilisée, mais elle pourra les trouver dans n’importe quel ordre. Cela nous amène à écrire des classes différentes inutilement. Cependant, TestNG fournit un moyen propre de fournir différents types de fournisseurs de données pour chaque méthode. Nous pouvons donc tester la même unité de code de manière valide et non valide dans la même classe de test en mettant séparément les données valides / non valides. Je vais aller avec TestNG.

    Un autre avantage de TestNG est le support des tests en parallèle. Je pense que dans notre ère de multicores, c’est important.

    J’ai aussi utilisé les deux frameworks. Mais j’utilise hamcrest pour les affirmations. Hamcrest vous permet d’écrire facilement votre propre méthode d’assertion. Donc au lieu de

     assertEquals(operation.getStatus(), Operation.Status.Active); 

    Tu peux é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 lorsque je veux exécuter une seule méthode de test dans une suite de tests. J’ajoute simplement ce test au groupe “phil” puis lance ce groupe. Lorsque j’utilisais JUnit 3, je mettais en commentaire les entrées de toutes les méthodes, sauf celle que je souhaitais utiliser avec la méthode “suite”, mais j’oubliais généralement de les décommenter avant de les archiver. 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 de manière quelque peu automatique avec sed et la création d’une classe de base pour remplacer TestCase que static importe toutes les méthodes d’assertion TestNG.

    J’ai des infos sur ma migration de JUnit vers TestNG ici et ici .

    JUnit 4 Vs TestNG – Comparaison par mkyong.com (mise à jour en 2013).

    Conclusion: Je suggère d’utiliser TestNG comme framework de test d’unité de base pour un projet Java, car TestNG est plus avancé dans les tests de paramétrage, les tests de dépendance et les tests de suites (concept de regroupement).

    TestNG est conçu pour les tests fonctionnels de haut niveau et les tests d’intégration complexes. Sa flexibilité est particulièrement utile avec les grandes suites de tests.

    De plus, TestNG couvre également l’ensemble des fonctionnalités de base de JUnit4 . Ce n’est pas une raison pour moi d’utiliser 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 pliée. Sur un si vous souhaitez comparer deux frameworks de test, vous souhaitez par contre implémenter facilement des tests, avoir des assertions naturelles, etc.

    Ok, tout d’abord, JUnit a commencé à jouer avec TestNG en termes de fonctionnalité, ils ont comblé le fossé avec la v4, mais pas assez à 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 des tests, puisque TestNG a une dépendance, un regroupement et un ordre de test.

    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, mais TestNG ne possède jamais ce problème.

    TBH, principalement les différences entre les deux frameworks ne signifient pas grand-chose, à moins que vous vous concensortingez sur les tests d’intégration / d’automatisation. JUnit de mon expérience est conçu dès le départ pour les tests unitaires et est maintenant poussé vers des niveaux de test plus élevés, ce qui en fait l’outil incorrect pour le travail. TestNG se débrouille bien lors des tests unitaires et grâce à son système de données robuste et à ses excellentes capacités d’exécution de tests, il fonctionne encore mieux au niveau des tests d’intégration / automatisation.

    Maintenant, pour ce que j’estime être une question distincte, comment écrire des tests bien structurés, lisibles et maintenables. Je suis certain que vous savez la plupart de ces choses, mais des éléments tels que le pattern d’usine, le pattern de commande et les objects de page (si vos sites de test) sont essentiels, il est très important d’avoir une couche d’abstraction entre vos tests et le test réel. est (affirmations de la logique métier). Pour avoir des assertions beaucoup plus agréables, vous pouvez utiliser Hamcrest . Utilisez les interfaces / inheritances javas pour réduire les répétitions et renforcer les points communs.

    Presque oublié, utilisez également le modèle de test Data Builder , ce qui, associé à l’annotation dataprovider de TestNG, est très utile.

    Mon avis sur ce qui rend TestNG vraiment 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?

    1. La déclaration de la méthode @BeforeClass et @AfterClass doit être statique dans JUnit, alors que TestNG offre plus de flexibilité dans la déclaration de la méthode, sans ces contraintes.

    2. Dans TestNG, nous pouvons paramétrer les tests de deux manières . Annotation @Parameter ou @DataProvider.

      i) @Paramètre pour les cas simples, où un mappage de valeur clé est requirejs (les données sont fournies via un fichier xml)

      ii) @DataProvider pour les cas complexes. En utilisant un tableau à 2 dimensions, il peut fournir des données.

    3. Dans TestNG, comme 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.

    4. Test de dépendance: dans TestNG, si le test initial échoue, tous les tests dépendants ultérieurs seront ignorés et non marqués comme ayant échoué. Mais JUnit a marqué son échec.

    5. Regroupement: les tests uniques peuvent appartenir à plusieurs groupes, puis être exécutés dans des contextes différents (comme les tests lents ou rapides). Une fonctionnalité similaire existe dans les catégories JUnit mais ne contient pas les annotations @BeforeGroups / @AfterGroups TestNG qui permettent d’initialiser le test / de l’arracher.

    6. Parallélisme: Si vous souhaitez exécuter le même test en parallèle sur plusieurs threads, TestNG vous propose une annotation simple à utiliser, alors que JUnit ne propose pas un moyen simple de le faire.

    7. TestNG @DataProvider peut également prendre en charge XML pour alimenter des données, des CSV ou même des fichiers en texte brut.

    8. 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 (dependOnMethods = {“dependOnSomething”})

    Cette fonctionnalité n’existe pas dans JUnit

    1. Reporting:

    Les rapports TestNG sont générés par défaut dans un dossier de sortie de test qui inclut des rapports HTML avec toutes les données de test, transmis / échoué / ignoré, combien de temps ont été exécutés, quelle entrée a été utilisée et les journaux de test complets. En outre, il exporte également tout vers un fichier XML qui peut être utilisé pour créer votre propre modèle de rapport.

    Sur le front de 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:

    1. Une comparaison Quick JUnit vs TestNG
    2. JUnit vs. TestNG: Quel cadre de test choisir?

    Une bonne différence est donnée dans ce tutoriel: TestNG Vs JUnit: Quelle est la différence?