TestNG est un framework de tests pour le langage de programmation Java créé par Cedric_Beust et inspiré de JUnit et NUnit . L'objectif de conception de TestNG est de couvrir une plus large gamme de catégories de tests : unitaires, fonctionnels, de bout en bout, d'intégration, etc., avec des fonctionnalités plus puissantes et plus simples à utiliser.
Caractéristiques
Les principales fonctionnalités de TestNG incluent :
- Prise en charge des annotations.
- Prise en charge des tests pilotés par données/paramétrés (avec
@DataProvideret/ou configuration XML). - Prise en charge de plusieurs instances de la même classe de test (avec
@Factory) - Modèle d'exécution flexible. TestNG peut être exécuté soit par Ant via build.xml (avec ou sans suite de tests définie), soit par un plugin IDE avec des résultats visuels. Il n'y a pas de
TestSuiteclasse, tandis que les suites de tests, les groupes et les tests sélectionnés pour être exécutés sont définis et configurés par des fichiers XML. - Tests simultanés : exécutez des tests dans des pools de threads arbitrairement grands avec différentes politiques disponibles (toutes les méthodes dans leur propre thread, un thread par classe de test, etc.) et testez si le code est multithread sécurisé.
- Intègre BeanShell pour plus de flexibilité.
- Fonctions JDK par défaut pour l'exécution et la journalisation (aucune dépendance).
- Méthodes dépendantes pour les tests des serveurs d'applications.
- Tests distribués : permet la distribution des tests sur des machines esclaves.
Fournisseur de données
Un fournisseur de données dans TestNG est une méthode dans une classe de test, qui fournit un tableau de valeurs réelles variées aux méthodes de test dépendantes.
Exemple:
//Cette méthode fournira des données à toute méthode de test qui déclare que son fournisseur de données s'appelle « provider1 ». @DataProvider ( name = "provider1" ) public Object [][] createData1 () { return new Object [][] { { "Cedric" , new Integer ( 36 ) }, { "Anne" , new Integer ( 37 ) } }; } // Cette méthode de test déclare que ses données doivent être fournies par le fournisseur de données nommé « provider1 ». @Test ( dataProvider = "provider1" ) public void verifyData1 ( String n1 , Integer n2 ) { System . out . println ( n1 + + n2 ); } // Un fournisseur de données qui renvoie un itérateur de tableaux de paramètres. @DataProvider ( name = "provider2" ) public Iterator < Object []> createData () { return new MyIterator (...); } // Un fournisseur de données avec un argument de type java.lang.reflect.Method. // Il est particulièrement utile lorsque plusieurs méthodes de test utilisent le même // fournisseur et que vous souhaitez qu'il renvoie des valeurs différentes selon // la méthode de test qu'il sert. @DataProvider ( name = "provider3" ) public Object [][] createData ( Method m ) { System . out . println ( m . getName ()); return new Object [][] { new Object [] { "Cedric" } }; }
Le type renvoyé par un fournisseur de données peut être l'un des deux types suivants :
- Un tableau d'objets (
Object[][]) où la taille de la première dimension est le nombre de fois que la méthode de test sera invoquée et la taille de la deuxième dimension contient un tableau d'objets qui doivent être compatibles avec les types de paramètres de la méthode de test. - Un
Iterator<Object[]>. La seule différence avecObject[][]un itérateur est qu'il vous permet de créer vos données de test paresseusement. TestNG invoquera l'itérateur puis la méthode de test avec les paramètres renvoyés par cet itérateur un par un. Ceci est particulièrement utile si vous avez beaucoup d'ensembles de paramètres à transmettre à la méthode et que vous ne souhaitez pas tous les créer à l'avance.
Support d'outils
TestNG est pris en charge, par défaut ou via des plug-ins, par chacun des trois principaux IDE Java : Eclipse , IntelliJ IDEA et NetBeans . Il est également fourni avec une tâche personnalisée pour Apache Ant et est pris en charge par le système de build Maven . Le serveur d'intégration continue Hudson prend en charge TestNG de manière intégrée et est capable de suivre et de représenter graphiquement les résultats des tests au fil du temps. La plupart des outils de couverture de code Java , tels que Cobertura , fonctionnent de manière transparente avec TestNG.
Remarque : la prise en charge de TestNG pour Eclipse est uniquement intégrée à Eclipse Marketplace pour les versions d'Eclipse jusqu'à 2018-09 (4.9). Pour les versions ultérieures d'Eclipse, TestNG doit être installé manuellement conformément aux instructions du site TestNG.
Rapports
TestNG génère des rapports de test aux formats HTML et XML. La sortie XML peut être transformée par la tâche Ant JUnitReport pour générer des rapports similaires à ceux obtenus avec JUnit. Depuis la version 4.6, TestNG fournit également une API de reporting qui permet d'utiliser des générateurs de rapports tiers, tels que ReportNG, PDFngreport et TestNG-XSLT, .
Comparaison avec JUnit
TestNG est en rivalité depuis longtemps avec un autre outil de test JUnit . Chaque framework présente des différences et des avantages respectifs. Les discussions sur Stack Overflow reflètent cette controverse.
Annotations
Dans JUnit 5, les méthodes @BeforeAll et @AfterAll doivent être déclarées comme statiques dans la plupart des cas. TestNG n'a pas cette contrainte.
TestNG inclut quatre paires d'annotations de configuration/démontage supplémentaires pour la suite de tests et les groupes : @BeforeSuite, @AfterSuite, @BeforeTest, @AfterTest, @BeforeGroup et @AfterGroup, @BeforeMethod et @AfterMethod. TestNG fournit également un support pour automatiser les tests d'une application à l'aide de Selenium.
Tests paramétrés
Les tests paramétrés sont implémentés dans les deux outils, mais de manières assez différentes.
TestNG dispose de deux manières de fournir différentes valeurs de paramètres à une méthode de test : en définissant le testng.xml et en définissant une méthode @DataProvider .
Dans JUnit 5, l' annotation @ParameterizedTest permet d'effectuer des tests paramétrés. Cette annotation est combinée à une autre annotation déclarant la source des arguments paramétrés, comme @ValueSource ou @EnumSource . L'utilisation de @ArgumentsSource permet à l'utilisateur d'implémenter un ArgumentsProvider. Dans JUnit 4, @RunWith et @Parameters sont utilisés pour faciliter les tests paramétrés, où la méthode @Parameters doit renvoyer un List[]avec les valeurs paramétrées, qui seront introduites dans le constructeur de la classe de test.
Conclusion
Différents utilisateurs préfèrent souvent certaines fonctionnalités d'un framework ou d'un autre. JUnit est plus largement populaire et souvent fourni par défaut avec les IDE classiques. TestNG est connu pour ses options de configuration supplémentaires et sa capacité à effectuer différents types de tests. Le choix de l'un ou l'autre dépend du contexte d'utilisation et des exigences.