TestNG - Guide rapide
Le test est le processus de vérification de la fonctionnalité d'une application pour s'assurer qu'elle fonctionne conformément aux exigences. Les tests unitaires sont pris en compte au niveau du développeur, où des mesures adéquates sont prises pour tester chaque entité (classe ou méthode) afin de garantir que le produit final répond aux exigences.
JUnit a poussé les développeurs à comprendre l'utilité des tests, en particulier des tests unitaires, par rapport à tout autre framework de test. En s'appuyant sur une architecture plutôt simple, pragmatique et stricte, JUnit a pu «infecter» un grand nombre de développeurs. Jetez un œil à notre tutoriel sur JUnit pour bien comprendre ses fonctionnalités. JUnit, en même temps, présente également quelques lacunes, qui sont énumérées ci-dessous -
Initialement conçu pour permettre uniquement les tests unitaires, maintenant utilisé pour toutes sortes de tests.
Impossible de tester les dépendances.
Mauvais contrôle de la configuration (setUp / tearDown).
Intrusif (vous oblige à étendre les classes et à nommer vos méthodes d'une certaine manière).
Modèle de programmation statique (vous oblige à recompiler inutilement).
La gestion de différentes suites de tests dans des projets complexes peut être très délicate.
Qu'est-ce que TestNG?
La définition de TestNG selon sa documentation est la suivante -
TestNG est un framework de test inspiré de JUnit et NUnit, mais présentant de nouvelles fonctionnalités qui le rendent plus puissant et plus facile à utiliser.
TestNG est un cadre de test automatisé open source; oùNG veux dire NextGénumération. TestNG est similaire à JUnit (en particulier JUnit 4), mais ce n'est pas une extension JUnit. Il est inspiré de JUnit. Il est conçu pour être meilleur que JUnit, en particulier lors du test de classes intégrées. Le créateur de TestNG est Cedric Beust .
En éliminant la plupart des limitations de l'ancien framework, TestNG donne au développeur la possibilité d'écrire des tests plus flexibles et plus puissants. Comme il emprunte beaucoup aux annotations Java (introduites avec JDK 5.0) pour définir des tests, il peut également vous montrer comment utiliser cette nouvelle fonctionnalité du langage Java dans un environnement de production réel.
Caractéristiques de TestNG
Prend en charge les annotations.
TestNG utilise plus de fonctionnalités Java et OO.
Prend en charge le test des classes intégrées (par exemple, par défaut, il n'est pas nécessaire de créer une nouvelle instance de classe de test pour chaque méthode de test).
Sépare le code de test au moment de la compilation des informations de configuration / données d'exécution.
Configuration d'exécution flexible.
Introduit des «groupes de test». Une fois que vous avez compilé vos tests, vous pouvez simplement demander à TestNG d'exécuter tous les tests "front-end", ou "rapides", "lents", "base de données", etc.
Prend en charge les méthodes de test dépendantes, les tests parallèles, les tests de charge et les échecs partiels.
API de plug-in flexible.
Prise en charge des tests multi-threads.
TestNG est un framework pour Java, donc la toute première exigence est d'avoir JDK installé sur votre machine.
Exigence du système
JDK | 1.5 ou supérieur. |
Mémoire | Aucune exigence minimale. |
Espace disque | Aucune exigence minimale. |
Système opérateur | Aucune exigence minimale. |
Étape 1 - Vérifiez l'installation de Java sur votre machine
Ouvrez la console et exécutez une commande java basée sur le système d'exploitation que vous avez installé sur votre système.
OS | Tâche | Commander |
---|---|---|
les fenêtres | Ouvrez la console de commande | c: \> java -version |
Linux | Ouvrir le terminal de commande | $ java -version |
Mac | Terminal ouvert | machine: ~ joseph $ java -version |
Vérifions la sortie pour tous les systèmes d'exploitation -
OS | Production |
---|---|
les fenêtres | version java "1.7.0_25" Environnement d'exécution Java (TM) SE (build 1.7.0_25-b15) VM serveur 64 bits Java HotSpot (TM) (build 23.25-b01, mode mixte) |
Linux | version java "1.7.0_25" Environnement d'exécution Java (TM) SE (build 1.7.0_25-b15) VM serveur 64 bits Java HotSpot (TM) (build 23.25-b01, mode mixte) |
Mac | version java "1.7.0_25" Environnement d'exécution Java (TM) SE (build 1.7.0_25-b15) VM serveur 64 bits Java HotSpot (TM) (build 23.25-b01, mode mixte) |
Si vous ne disposez pas de Java, installez le kit de développement logiciel Java (SDK) à partir de https://www.oracle.com/technetwork/java/javase/downloads/index.html. Nous supposons que Java 1.7.0_25 est la version installée pour ce didacticiel.
Étape 2: définir l'environnement JAVA
Met le JAVA_HOMEvariable d'environnement pour pointer vers l'emplacement du répertoire de base, où Java est installé sur votre machine. Par exemple,
OS | Production |
---|---|
les fenêtres | Définissez la variable d'environnement JAVA_HOME sur C: \ Program Files \ Java \ jdk1.7.0_25. |
Linux | Exportez JAVA_HOME = / usr / local / java-current. |
Mac | Exportez JAVA_HOME = / Library / Java / Home. |
Ajoutez l'emplacement du compilateur Java au chemin système.
OS | Production |
---|---|
les fenêtres | Ajoutez la chaîne C: \ Program Files \ Java \ jdk1.7.0_25 \ bin à la fin de la variable système, Path. |
Linux | Exporter PATH =$PATH:$JAVA_HOME / bin / |
Mac | Non requis |
Vérifiez l'installation de Java à l'aide de la commande java -version comme expliqué ci-dessus.
Étape 3: Téléchargez l'archive TestNG
Téléchargez la dernière version du fichier jar TestNG à partir de http://www.testng.org. Au moment de la rédaction de ce tutoriel, nous avons téléchargé testng-6.8.jar et l' avons copié dans le dossier C: \> TestNG.
OS | Nom de l'archive |
---|---|
les fenêtres | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Étape 4: définir l'environnement TestNG
Met le TESTNG_HOMEvariable d'environnement pour pointer vers l'emplacement du répertoire de base, où le jar TestNG est stocké sur votre machine. Le tableau suivant montre comment définir la variable d'environnement dans Windows, Linux et Mac, en supposant que nous avons stocké testng-6.8.jar à l'emplacement C: \> TestNG.
OS | La description |
---|---|
les fenêtres | Définissez la variable d'environnement TESTNG_HOME sur C: \ TESTNG. |
Linux | Exporter TESTNG_HOME = / usr / local / TESTNG |
Mac | Exporter TESTNG_HOME = / Bibliothèque / TESTNG |
Étape 5: Définissez la variable CLASSPATH
Met le CLASSPATH variable d'environnement pour pointer vers l'emplacement du jar TestNG.
OS | La description |
---|---|
les fenêtres | Définissez la variable d'environnement CLASSPATH sur% CLASSPATH%;% TESTNG_HOME% \ testng-6.8.jar. |
Linux | Exporter CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar. |
Mac | Exporter CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar. |
Étape 6: Tester la configuration de TestNG
Créez un fichier de classe Java nommé TestNGSimpleTest à C:\>TestNG_WORKSPACE.
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class TestNGSimpleTest {
@Test
public void testAdd() {
String str = "TestNG is working fine";
AssertEquals("TestNG is working fine", str);
}
}
TestNG peut être appelé de plusieurs manières différentes -
- Avec un fichier testng.xml.
- Avec ANT.
- Depuis la ligne de commande.
Appelons-nous en utilisant le fichier testng.xml. Créez un fichier xml avec le nom testng.xml dansC:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestNGSimpleTest"/>
</classes>
</test>
</suite>
Étape 7: Vérifiez le résultat
Compilez la classe en utilisant javac compilateur comme suit -
C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java
Maintenant, appelez le testng.xml pour voir le résultat -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
L'écriture d'un test dans TestNG implique essentiellement les étapes suivantes -
Écrivez la logique métier de votre test et insérez des annotations TestNG dans votre code.
Ajoutez les informations sur votre test (par exemple le nom de la classe, les groupes que vous souhaitez exécuter, etc.) dans un fichier testng.xml ou dans build.xml.
Exécutez TestNG.
Ici, nous verrons un exemple complet de test TestNG utilisant la classe POJO, la classe de logique métier et un test xml, qui sera exécuté par TestNG.
Créer EmployeeDetails.java dans C:\>TestNG_WORKSPACE, qui est une classe POJO.
public class EmployeeDetails {
private String name;
private double monthlySalary;
private int age;
// @return the name
public String getName() {
return name;
}
// @param name the name to set
public void setName(String name) {
this.name = name;
}
// @return the monthlySalary
public double getMonthlySalary() {
return monthlySalary;
}
// @param monthlySalary the monthlySalary to set
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
// @return the age
public int getAge() {
return age;
}
// @param age the age to set
public void setAge(int age) {
this.age = age;
}
}
EmployeeDetails la classe est utilisée pour -
- obtenir / définir la valeur du nom de l'employé.
- obtenir / définir la valeur du salaire mensuel de l'employé.
- obtenir / définir la valeur de l'âge de l'employé.
Créé un EmpBusinessLogic.java dans C:\>TestNG_WORKSPACE, qui contient la logique métier.
public class EmpBusinessLogic {
// Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails) {
double yearlySalary = 0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}
// Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails) {
double appraisal = 0;
if(employeeDetails.getMonthlySalary() < 10000) {
appraisal = 500;
} else {
appraisal = 1000;
}
return appraisal;
}
}
EmpBusinessLogic la classe est utilisée pour calculer -
- le salaire annuel de l'employé.
- le montant de l'évaluation de l'employé.
Maintenant, créons une classe TestNG appelée TestEmployeeDetails.javadans C: \> TestNG_WORKSPACE. Une classe TestNG est une classe Java qui contient au moins une annotation TestNG. Cette classe contient des cas de test à tester. Un test TestNG peut être configuré par les annotations @BeforeXXX et @AfterXXX (nous le verrons dans le chapitre TestNG - Procédure d'exécution ), ce qui permet d'exécuter une logique Java avant et après un certain point.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
Assert.assertEquals(500, appraisal, 0.0, "500");
}
// Test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
Assert.assertEquals(96000, salary, 0.0, "8000");
}
}
TestEmployeeDetails class est utilisé pour tester les méthodes de EmpBusinessLogicclasse. Il fait ce qui suit -
Teste le salaire annuel de l'employé.
Teste le montant de l'évaluation de l'employé.
Avant de pouvoir exécuter les tests, vous devez configurer TestNG à l'aide d'un fichier XML spécial, appelé conventionnellement testng.xml. La syntaxe de ce fichier est très simple et son contenu est présenté ci-dessous. Créez ce fichier dansC:\>TestNG_WORKSPACE.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestEmployeeDetails"/>
</classes>
</test>
</suite>
Les détails du fichier ci-dessus sont les suivants -
Une suite est représentée par un fichier XML. Il peut contenir un ou plusieurs tests et est défini par la balise <suite>.
La balise <test> représente un test et peut contenir une ou plusieurs classes TestNG.
La balise <class> représente une classe TestNG. C'est une classe Java qui contient au moins une annotation TestNG. Il peut contenir une ou plusieurs méthodes de test.
Compilez les classes de cas de test à l'aide de javac.
C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java
Maintenant TestNG avec la commande suivante -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Si tout a été fait correctement, vous devriez voir les résultats de vos tests dans la console. De plus, TestNG crée un très joli rapport HTML dans un dossier appelétest-outputqui est automatiquement créé dans le répertoire courant. Si vous l'ouvrez et chargez index.html, vous verrez une page similaire à celle de l'image ci-dessous -
La manière traditionnelle d'indiquer les méthodes de test dans JUnit 3 est de préfixer leurs noms par test. C'est une méthode très efficace pour marquer certaines méthodes d'une classe comme ayant une signification particulière, mais la dénomination ne s'adapte pas très bien (et si nous voulons ajouter plus de balises pour différents frameworks?) Et est plutôt inflexible (et si nous voulez passer des paramètres supplémentaires au cadre de test?).
Des annotations ont été officiellement ajoutées au langage Java dans JDK 5, et TestNG a fait le choix d'utiliser des annotations pour annoter les classes de test.
Voici la liste des annotations prises en charge par TestNG -
Sr.No. | Annotation et description |
---|---|
1 | @BeforeSuite La méthode annotée ne sera exécutée qu'une seule fois avant que tous les tests de cette suite ne soient exécutés. |
2 | @AfterSuite La méthode annotée ne sera exécutée qu'une seule fois après l'exécution de tous les tests de cette suite. |
3 | @BeforeClass La méthode annotée ne sera exécutée qu'une seule fois avant que la première méthode de test de la classe actuelle ne soit appelée. |
4 | @AfterClass La méthode annotée ne sera exécutée qu'une seule fois après l'exécution de toutes les méthodes de test de la classe actuelle. |
5 | @BeforeTest La méthode annotée sera exécutée avant l'exécution de toute méthode de test appartenant aux classes à l'intérieur de la balise <test>. |
6 | @AfterTest La méthode annotée sera exécutée après l'exécution de toutes les méthodes de test appartenant aux classes à l'intérieur de la balise <test>. |
sept | @BeforeGroups La liste des groupes que cette méthode de configuration exécutera avant. Il est garanti que cette méthode s'exécutera peu de temps avant que la première méthode de test appartenant à l'un de ces groupes ne soit appelée. |
8 | @AfterGroups La liste des groupes après lesquels cette méthode de configuration s'exécutera. Cette méthode est garantie de s'exécuter peu de temps après que la dernière méthode de test appartenant à l'un de ces groupes est appelée. |
9 | @BeforeMethod La méthode annotée sera exécutée avant chaque méthode de test. |
dix | @AfterMethod La méthode annotée sera exécutée après chaque méthode de test. |
11 | @DataProvider Marque une méthode comme fournissant des données pour une méthode d'essai. La méthode annotée doit renvoyer un objet [] [], où chaque objet [] peut se voir attribuer la liste des paramètres de la méthode de test. La méthode @Test qui souhaite recevoir des données de ce DataProvider doit utiliser un nom dataProvider égal au nom de cette annotation. |
12 | @Factory
Marque une méthode comme une fabrique qui renvoie des objets qui seront utilisés par TestNG comme classes de test. La méthode doit renvoyer Object []. |
13 | @Listeners Définit les écouteurs sur une classe de test. |
14 | @Parameters Décrit comment passer des paramètres à une méthode @Test. |
15 | @Test Marque une classe ou une méthode comme faisant partie du test. |
Avantages de l'utilisation des annotations
Voici quelques-uns des avantages de l'utilisation des annotations -
TestNG identifie les méthodes qui l'intéressent, en recherchant des annotations. Par conséquent, les noms de méthode ne sont limités à aucun modèle ou format.
Nous pouvons passer des paramètres supplémentaires aux annotations.
Les annotations sont fortement typées, de sorte que le compilateur signalera immédiatement toute erreur.
Les classes de test n'ont plus besoin d'étendre quoi que ce soit (comme TestCase, pour JUnit 3).
Ce chapitre explique la procédure d'exécution des méthodes dans TestNG. Il explique l'ordre des méthodes appelées. Voici la procédure d'exécution des méthodes de l'API de test TestNG avec un exemple.
Créer un nom de fichier de classe Java TestngAnnotation.java dans C:\>TestNG_WORKSPACE pour tester les annotations.
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;
public class TestngAnnotation {
// test case 1
@Test
public void testCase1() {
System.out.println("in test case 1");
}
// test case 2
@Test
public void testCase2() {
System.out.println("in test case 2");
}
@BeforeMethod
public void beforeMethod() {
System.out.println("in beforeMethod");
}
@AfterMethod
public void afterMethod() {
System.out.println("in afterMethod");
}
@BeforeClass
public void beforeClass() {
System.out.println("in beforeClass");
}
@AfterClass
public void afterClass() {
System.out.println("in afterClass");
}
@BeforeTest
public void beforeTest() {
System.out.println("in beforeTest");
}
@AfterTest
public void afterTest() {
System.out.println("in afterTest");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("in beforeSuite");
}
@AfterSuite
public void afterSuite() {
System.out.println("in afterSuite");
}
}
Ensuite, créons le fichier testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des annotations.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestngAnnotation"/>
</classes>
</test>
</suite>
Compilez la classe de cas de test en utilisant javac.
C:\TestNG_WORKSPACE>javac TestngAnnotation.java
Maintenant, exécutez le testng.xml, qui exécutera le cas de test défini dans la classe de cas de test fournie.
C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml
Vérifiez la sortie.
in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Sur la base de la sortie ci-dessus, la procédure d'exécution est la suivante -
Tout d'abord, la méthode beforeSuite () n'est exécutée qu'une seule fois.
Enfin, la méthode afterSuite () ne s'exécute qu'une seule fois.
Même les méthodes beforeTest (), beforeClass (), afterClass () et afterTest () ne sont exécutées qu'une seule fois.
beforeMethod () s'exécute pour chaque cas de test mais avant d'exécuter le cas de test.
La méthode afterMethod () s'exécute pour chaque cas de test mais après l'exécution du cas de test.
Entre beforeMethod () et afterMethod (), chaque scénario de test s'exécute.
Les cas de test sont exécutés en utilisant TestNGclasse. Cette classe est le principal point d'entrée pour exécuter des tests dans le framework TestNG. Les utilisateurs peuvent créer leur propre objet TestNG et l'appeler de différentes manières, par exemple:
Sur un testng.xml existant.
Sur un testng.xml synthétique, entièrement créé à partir de Java.
En définissant directement les classes de test.
Vous pouvez également définir les groupes à inclure ou exclure, affecter des paramètres, etc. Les paramètres de ligne de commande sont -
-d outputdir: spécifie le répertoire de sortie.
-testclass nom_classe: spécifie un ou plusieurs noms de classe.
-testjar nom_jar: spécifie le fichier jar contenant les tests.
-sourcedir src1; src2:; liste séparée des répertoires source (utilisée uniquement lorsque des annotations javadoc sont utilisées).
-target
-groups
-testrunfactory
-listener
Nous allons créer l'objet TestNG un testng.xml existant dans notre exemple ci-dessous.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\>TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple, SampleTest.java.
Ajoutez une méthode de test testPrintMessage () à votre classe de test.
Ajoutez une annotation @Test à la méthode testPrintMessage ().
Implémentez la condition de test et vérifiez la condition à l'aide de l'API assertEquals de TestNG.
Créez un fichier de classe Java appelé SampleTest.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class SampleTest {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message, messageUtil.printMessage());
}
}
Créer testng.xml
Ensuite, créons le fichier testng.xml dans C:\>TestNG_WORKSPACE, pour exécuter des cas de test. Ce fichier capture l'ensemble de vos tests en XML. Ce fichier facilite la description de toutes vos suites de tests et de leurs paramètres dans un seul fichier, que vous pouvez archiver dans votre référentiel de code ou par e-mail à vos collègues. Cela facilite également l'extraction de sous-ensembles de vos tests ou la division de plusieurs configurations d'exécution (par exemple, testngdatabase.xml n'exécuterait que des tests qui exercent votre base de données).
<?xml version = "1.0" encoding = "UTF-8"?>
<suite name = "Sample test Suite">
<test name = "Sample test">
<classes>
<class name = "SampleTest" />
</classes>
</test>
</suite>
Compilez le scénario de test à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java SampleTest.java
Maintenant, exécutez le testng.xml, qui exécutera le cas de test défini dans la balise <test>.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
Hello World
===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
UNE test suiteest un ensemble de cas de test destinés à tester un comportement ou un ensemble de comportements d'un logiciel. Dans TestNG, nous ne pouvons pas définir une suite dans le test du code source, mais elle est représentée par un fichier XML, car la suite est la fonction d'exécution. Il permet également une configuration flexible des tests à exécuter. Une suite peut contenir un ou plusieurs tests et est définie par la balise <suite>.
<suite> est la balise racine de votre testng.xml. Il décrit une suite de tests, qui à son tour est composée de plusieurs sections <test>.
Le tableau suivant répertorie tous les attributs légaux acceptés par <suite>.
Sr.No. | Attribut et description |
---|---|
1 | name Le nom de cette suite. C'est unmandatory attribut. |
2 | verbose Le niveau ou la verbosité de cette exécution. |
3 | parallel Si TestNG doit exécuter différents threads pour exécuter cette suite. |
4 | thread-count Le nombre de threads à utiliser, si le mode parallèle est activé (ignoré dans le cas contraire). |
5 | annotations Le type d'annotations que vous utilisez dans vos tests. |
6 | time-out Délai d'expiration par défaut qui sera utilisé sur toutes les méthodes de test trouvées dans ce test. |
Dans ce chapitre, nous allons vous montrer un exemple ayant deux classes de test, Test1 et Test2, à exécuter ensemble à l'aide de Test Suite.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\>JUNIT_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer des classes de cas de test
Créez un fichier de classe Java nommé Test1.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message, messageUtil.printMessage());
}
}
Créez un fichier de classe Java nommé Test2.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test2 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Maintenant, écrivons le testng.xml dans C:\>TestNG_WORKSPACE, qui contiendrait la balise <suite> comme suit -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "exampletest1">
<classes>
<class name = "Test1" />
</classes>
</test>
<test name = "exampletest2">
<classes>
<class name = "Test2" />
</classes>
</test>
</suite>
Suite1 comprend exampletest1 et exampletest2.
Compilez toutes les classes java en utilisant javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java
Maintenant, exécutez le testng.xml, qui exécutera le cas de test défini dans la classe de cas de test fournie.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Vous pouvez également vérifier le dossier de sortie de test . Dans le dossier Suite1 , vous pouvez voir deux fichiers html créés, exampletest1.html et exampletest2.html, qui ressembleraient à ceci:
Parfois, il arrive que notre code ne soit pas prêt et que le cas de test écrit pour tester cette méthode / ce code échoue. Dans de tels cas, l'annotation@Test(enabled = false) aide à désactiver ce cas de test.
Si une méthode de test est annotée avec @Test (enabled = false) , le scénario de test qui n'est pas prêt à tester est contourné.
Voyons maintenant @Test (enabled = false) en action.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\>TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple, IgnoreTest.java.
Ajoutez des méthodes de test, testPrintMessage () et testSalutationMessage (), à votre classe de test.
Ajoutez une annotation @Test (enabled = false) à la méthode testPrintMessage ().
Créez un fichier de classe Java nommé IgnoreTest.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class IgnoreTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(enabled = false)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
}
Créer testng.xml
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "IgnoreTest" />
</classes>
</test>
</suite>
Compilez les classes MessageUtil et cas de test à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java IgnoreTest.java
Maintenant, exécutez le testng.xml, qui n'exécutera pas testPrintMessage () le cas de test défini dans la classe de cas de test fournie.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie. Le cas de test testPrintMessage () n'est pas testé.
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Vous pouvez également ignorer un groupe de tests, qui sera abordé dans le chapitre suivant.
Le test de groupe est une nouvelle fonctionnalité innovante de TestNG, qui n'existe pas dans le framework JUnit. Il vous permet de répartir les méthodes en portions appropriées et d'effectuer des regroupements sophistiqués de méthodes de test.
Non seulement vous pouvez déclarer les méthodes qui appartiennent à des groupes, mais vous pouvez également spécifier des groupes qui contiennent d'autres groupes. Ensuite, TestNG peut être appelé et invité à inclure un certain ensemble de groupes (ou d'expressions régulières), tout en excluant un autre ensemble.
Les tests de groupe offrent une flexibilité maximale dans la manière dont vous partitionnez vos tests et ne vous obligent pas à recompiler quoi que ce soit si vous souhaitez exécuter deux ensembles de tests différents l'un après l'autre.
Les groupes sont spécifiés dans votre fichier testng.xml à l'aide de la balise <groups>. Il peut être trouvé sous la balise <test> ou <suite>. Les groupes spécifiés dans la balise <suite> s'appliquent à toutes les balises <test> en dessous.
Maintenant, prenons un exemple pour voir comment fonctionne le test de groupe.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\> TestNG_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "tutorialspoint" to the message
public String salutationMessage() {
message = "tutorialspoint" + message;
System.out.println(message);
return message;
}
// add "www." to the message
public String exitMessage() {
message = "www." + message;
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple GroupTestExample.java.
Ajoutez des méthodes de test, testPrintMessage () et testSalutationMessage (), à votre classe de test.
Regroupez la méthode d'essai en deux catégories -
Check-in tests (checkintest)- Ces tests doivent être exécutés avant de soumettre un nouveau code. Ils doivent généralement être rapides et s'assurer qu'aucune fonctionnalité de base n'est interrompue.
Functional tests (functest) - Ces tests doivent couvrir toutes les fonctionnalités de votre logiciel et être exécutés au moins une fois par jour, bien que vous souhaitiez idéalement les exécuter en continu.
Créez le fichier de classe Java nommé GroupTestExample.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class GroupTestExample {
String message = ".com";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "functest", "checkintest" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = ".com";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(groups = { "checkintest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "tutorialspoint" + ".com";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "functest" })
public void testingExitMessage() {
System.out.println("Inside testExitMessage()");
message = "www." + "tutorialspoint"+".com";
Assert.assertEquals(message, messageUtil.exitMessage());
}
}
Créer testng.xml
Créez testng.xml dans C:\> TestNG_WORKSPACE, pour exécuter des cas de test. Ici, nous n'exécuterions que les tests qui appartiennent au groupe fonctest .
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<run>
<include name = "functest" />
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
Compilez les classes de cas de test MessageUtil à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java GroupTestExample.java
Maintenant, exécutez le testng.xml, qui exécutera uniquement la méthode testPrintMessage (), car elle appartient au groupe fonctest .
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie. Seule la méthode testPrintMessage () est exécutée.
Inside testPrintMessage()
.com
Inside testExitMessage()
www..com
===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================
Groupe de groupes
Les groupes peuvent également inclure d'autres groupes. Ces groupes sont appelésMetaGroups. Par exemple, vous souhaiterez peut-être définir un groupe incluant tous les checkintest et functest . Modifions notre fichier testng.xml comme suit -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<include name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
L'exécution du testng.xml ci-dessus exécutera les trois tests et vous donnera le résultat suivant -
Inside testPrintMessage()
.com
Inside testSalutationMessage()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.com
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Groupes d'exclusion
Vous pouvez ignorer un groupe en utilisant la balise <exclude> comme indiqué ci-dessous -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<exclude name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
TestNG fournit une option de suivi de la gestion des exceptions du code. Vous pouvez tester si un code lève une exception souhaitée ou non. Ici leexpectedExceptionsLe paramètre est utilisé avec l'annotation @Test. Maintenant, voyons@Test(expectedExceptions) en action.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\> TestNG_WORKSPACE. Ajoutez une condition d'erreur dans la méthode printMessage ().
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public void printMessage() {
System.out.println(message);
int a =0;
int b = 1/a;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple, ExpectedExceptionTest.java.
Ajoutez une exception ArithmeticException attendue au scénario de test testPrintMessage ().
Créez un fichier de classe Java nommé ExpectedExceptionTest.java dans C:\> TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class ExpectedExceptionTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expectedExceptions = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Créer un testeur
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ExpectedExceptionTest" />
</classes>
</test>
</suite>
Compilez les classes de cas de test MessageUtil à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java TestJunit.java
Maintenant, exécutez le Test Runner, qui exécutera les cas de test définis dans la classe de cas de test fournie.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie. Le cas de test testPrintMessage () sera passé.
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Parfois, vous devrez peut-être appeler des méthodes dans un cas de test dans un ordre particulier, ou vous souhaiterez peut-être partager des données et un état entre les méthodes. Ce type de dépendance est pris en charge par TestNG, car il prend en charge la déclaration de dépendances explicites entre les méthodes de test.
TestNG vous permet de spécifier des dépendances soit avec -
Utilisation de l'attribut dependOnMethods dans les annotations @Test, OU.
Utilisation de l'attribut dependOnGroups dans les annotations @Test.
Exemple d'utilisation de dependOnMethods
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\>TestNG_WORKSPACE.
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple DependencyTestUsingAnnotation.java.
Ajoutez des méthodes de test, testPrintMessage () et testSalutationMessage (), et initEnvironmentTest (), à votre classe de test.
Ajouter un attribut dependsOnMethods = {"initEnvironmentTest"} à l'annotation @Test de testSalutationMessage() méthode.
Créer un nom de fichier de classe Java DependencyTestUsingAnnotation.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnMethods = { "initEnvironmentTest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
Créer testng.xml
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
Compilez les classes de cas de test MessageUtil à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
Maintenant, exécutez le testng.xml, qui exécutera la méthode testSalutationMessage () uniquement après l'exécution de la méthode initEnvironmentTest ().
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Exemple d'utilisation de dependOnGroups
Vous pouvez également avoir des méthodes qui dépendent de groupes entiers. Prenons un exemple pour le démontrer.
Créer une classe
Créez une classe java à tester, disons, MessageUtil.java dans C:\>TestNG_WORKSPACE.
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer une classe de cas de test
Créez une classe de test java, par exemple DependencyTestUsingAnnotation.java.
Ajoutez des méthodes de test, testPrintMessage () testSalutationMessage () et initEnvironmentTest () à votre classe de test et ajoutez-les au groupe "init".
Ajouter l'attribut dependsOnMethods = {"init.*"} à l'annotation @Test de testSalutationMessage() méthode.
Créez un fichier de classe Java nommé DependencyTestUsingAnnotation.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "init" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnGroups = { "init.*" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "init" })
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
Dans cet exemple, testSalutationMessage () est déclaré comme dépendant de n'importe quel groupe, correspondant à l'expression régulière «init. *», Qui garantit que les méthodes testPrintMessage () et initEnvironmentTest () seront toujours appelées avant testSalutationMessage ().
Si une méthode dépendante échoue et que vous en avez une dépendance ferme (alwaysRun = false, qui est la valeur par défaut), les méthodes qui en dépendent ne sont pas marquées comme FAIL mais comme SKIP. Les méthodes ignorées seront signalées comme telles dans le rapport final (dans une couleur qui n'est ni rouge ni verte en HTML), ce qui est important car les méthodes ignorées ne sont pas nécessairement des échecs.
Créer testng.xml
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
Compilez les classes de cas de test MessageUtil à l'aide de javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
Maintenant, exécutez le testng.xml, qui exécutera la méthode testSalutationMessage () uniquement après l'exécution de la méthode initEnvironmentTest () .
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
dependOnGroups vs dependOnMethods
En utilisant des groupes, nous ne sommes plus exposés à des problèmes de refactoring. Tant que nous ne modifions pas les attributs dependOnGroups ou groupes, nos tests continueront de s'exécuter avec les dépendances correctement configurées.
Chaque fois qu'une nouvelle méthode doit être ajoutée dans le graphe de dépendances, il suffit de la mettre dans le bon groupe et de s'assurer qu'elle dépend du bon groupe. Nous n'avons pas besoin de modifier une autre méthode.
Une autre fonctionnalité intéressante disponible dans TestNG est parametric testing. Dans la plupart des cas, vous rencontrerez un scénario où la logique métier nécessite un nombre extrêmement variable de tests.Parameterized tests permettre aux développeurs d'exécuter le même test encore et encore en utilisant des valeurs différentes.
TestNG vous permet de transmettre des paramètres directement à vos méthodes de test de deux manières différentes -
- Avec testng.xml
- Avec les fournisseurs de données
Passer des paramètres avec testng.xml
Avec cette technique, vous définissez les paramètres simples dans le fichier testng.xml , puis référencez ces paramètres dans les fichiers source. Prenons un exemple pour montrer comment utiliser cette technique pour passer des paramètres.
Créer une classe de cas de test
Créez une classe de test java, par exemple ParameterizedTest1.java.
Ajoutez la méthode de test parameterTest () à votre classe de test. Cette méthode prend une chaîne comme paramètre d'entrée.
Ajoutez l'annotation @Parameters ("myName") à cette méthode. Le paramètre recevrait une valeur de testng.xml, que nous verrons à l'étape suivante.
Créez un fichier de classe Java nommé ParameterizedTest1.java dans C:\>TestNG_WORKSPACE.
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("myName")
public void parameterTest(String myName) {
System.out.println("Parameterized value is : " + myName);
}
}
Créer testng.xml
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<parameter name = "myName" value="manisha"/>
<classes>
<class name = "ParameterizedTest1" />
</classes>
</test>
</suite>
Nous pouvons également définir les paramètres au niveau <suite>. Supposons que nous ayons défini myName aux niveaux <suite> et <test>. Dans de tels cas, les règles de cadrage régulières s'appliquent. Cela signifie que toute classe à l'intérieur de la balise <test> verra la valeur du paramètre défini dans <test>, tandis que les classes du reste du fichier testng.xml verront la valeur définie dans <suite>.
Compilez la classe de cas de test en utilisant javac.
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
Maintenant, exécutez testng.xml, qui exécutera la méthode parameterTest . TestNG essaiera de trouver d'abord un paramètre nommé myName dans la balise <test>, puis, s'il ne le trouve pas, il cherchera dans la balise <suit> qui l'englobe.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
Parameterized value is : manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG essaiera automatiquement de convertir la valeur spécifiée dans testng.xml au type de votre paramètre. Voici les types pris en charge -
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
Passage de paramètres avec des fournisseurs de données
Lorsque vous devez transmettre des paramètres complexes ou des paramètres qui doivent être créés à partir de Java (objets complexes, objets lus à partir d'un fichier de propriétés ou d'une base de données, etc.), les paramètres peuvent être passés à l'aide de Dataproviders.
Un fournisseur de données est une méthode annotée avec @DataProvider. Cette annotation n'a qu'un seul attribut de chaîne: son nom. Si le nom n'est pas fourni, le nom du fournisseur de données prend automatiquement par défaut le nom de la méthode. Un fournisseur de données renvoie un tableau d'objets.
Les exemples suivants montrent comment utiliser les fournisseurs de données. Le premier exemple concerne @DataProvider utilisant Vector, String ou Integer comme paramètre, et le deuxième exemple concerne @DataProvider utilisant un objet comme paramètre.
Exemple 1
Ici, le @DataProvider passe Integer et Boolean comme paramètre.
Create Java class
Créez une classe Java appelée PrimeNumberChecker.java. Cette classe vérifie si le nombre est premier. Créez cette classe dansC:\>TestNG_WORKSPACE.
public class PrimeNumberChecker {
public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber / 2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}
}
Create Test Case Class
Créez une classe de test java, par exemple ParamTestWithDataProvider1.java.
Définissez la méthode primeNumbers (), qui est définie comme un fournisseur de données à l'aide de l'annotation. Cette méthode renvoie un tableau d'objets.
Ajoutez la méthode de test testPrimeNumberChecker () à votre classe de test. Cette méthode prend un entier et un booléen comme paramètres d'entrée. Cette méthode valide si le paramètre passé est un nombre premier.
Ajoutez l'annotation @Test (dataProvider = "test1") à cette méthode. L'attribut dataProvider est mappé à "test1".
Créez un fichier de classe Java nommé ParamTestWithDataProvider1.java dans C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider1 {
private PrimeNumberChecker primeNumberChecker;
@BeforeMethod
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}
// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}
}
Create testng.xml
Créez un testng.xml C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider1" />
</classes>
</test>
</suite>
Compilez la classe de cas de test en utilisant javac.
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
Maintenant, exécutez testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
2 true
6 false
19 true
22 false
23 true
===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================
Exemple 2
Ici, le @DataProvider passe Object comme paramètre.
Create Java class
Créez une classe java Bean.java, qui est un objet simple avec des méthodes get / set, dans C:\>TestNG_WORKSPACE.
public class Bean {
private String val;
private int i;
public Bean(String val, int i) {
this.val = val;
this.i = i;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
Create Test Case Class
Créez une classe de test java, par exemple ParamTestWithDataProvider2.java.
Définissez la méthode primeNumbers (), qui est définie comme un fournisseur de données utilisant l'annotation. Cette méthode renvoie un tableau d'objets.
Ajoutez la méthode de test testMethod () à votre classe de test. Cette méthode prend un bean objet comme paramètre.
Ajoutez l'annotation @Test (dataProvider = "test1") à cette méthode. L'attribut dataProvider est mappé à "test1".
Créez un fichier de classe Java nommé ParamTestWithDataProvider2.java dans C:\>TestNG_WORKSPACE.
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider2 {
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] { { new Bean("hi I am the bean", 111) } };
}
@Test(dataProvider = "test1")
public void testMethod(Bean myBean) {
System.out.println(myBean.getVal() + " " + myBean.getI());
}
}
Create testng.xml
Créez testng.xml dans C:\>TestNG_WORKSPACE pour exécuter des cas de test.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider2" />
</classes>
</test>
</suite>
Compilez la classe de cas de test en utilisant javac.
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
Maintenant, exécutez testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Vérifiez la sortie.
hi I am the bean 111
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Maintenant que vous avez compris TestNG et ses différents tests, vous devez maintenant vous inquiéter de la façon de refactoriser votre code JUnit existant. Il n'y a pas lieu de s'inquiéter, car TestNG offre un moyen de passer de JUnit à TestNG à votre propre rythme. Vous pouvez exécuter vos cas de test JUnit existants à l'aide de TestNG.
TestNG peut automatiquement reconnaître et exécuter des tests JUnit, de sorte que vous pouvez utiliser TestNG en tant que coureur pour tous vos tests existants et écrire de nouveaux tests à l'aide de TestNG. Tout ce que vous avez à faire est de mettre la bibliothèque JUnit sur le chemin de classe TestNG, afin qu'elle puisse trouver et utiliser les classes JUnit, changer votre testeur de JUnit en TestNG dans Ant, puis exécuter TestNG en mode "mixte". De cette façon, vous pouvez avoir tous vos tests dans le même projet, même dans le même package, et commencer à utiliser TestNG. Cette approche vous permet également de convertir vos tests JUnit existants en TestNG de manière incrémentielle.
Prenons un exemple pour démontrer cette incroyable capacité de TestNG.
Créer une classe de cas de test JUnit
Créez une classe java, qui est une classe de test JUnit, TestJunit.java dans C:\>TestNG_WORKSPACE.
import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit testing using TestNG";
AssertEquals("Junit testing using TestNG",str);
}
}
Maintenant, écrivons le testng.xml dans C:\>TestNG_WORKSPACE, qui contiendrait la balise <suite> comme suit -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Converted JUnit suite" >
<test name = "JUnitTests" junit="true">
<classes>
<class name = "TestJunit" />
</classes>
</test>
</suite>
Pour exécuter les cas de test JUnit, définissez la propriété junit = "true" comme dans le xml ci-dessus. La classe de cas de test JUnit TestJunit est définie dans le nom de la classe.
Pour JUnit 4, TestNG utilisera le runner org.junit.runner.JUnitCore pour exécuter vos tests.
Compilez toutes les classes java en utilisant javac.
C:\TestNG_WORKSPACE>javac TestJunit.java
Maintenant, exécutez testng.xml, qui exécutera le cas de test JUnit en tant que TestNG.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml
Ici, nous avons placé le junit-4.11.jar sous C: \ TestNG_WORKSPACE \ lib \ junit-4.11.jar.
Vérifiez la sortie.
===============================================
Converted JUnit suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Le reporting est la partie la plus importante de toute exécution de test, car il aide l'utilisateur à comprendre le résultat de l'exécution du test, le point d'échec et les raisons de l'échec. La journalisation, en revanche, est importante pour garder un œil sur le flux d'exécution ou pour le débogage en cas d'échec.
TestNG, par défaut, génère un type de rapport différent pour son exécution de test. Cela inclut une sortie de rapport HTML et XML. TestNG permet également à ses utilisateurs d'écrire leur propre reporter et de l'utiliser avec TestNG. Il existe également une option pour écrire vos propres enregistreurs, qui sont notifiés lors de l'exécution par TestNG.
Il existe deux façons de générer un rapport avec TestNG -
Listeners- Pour implémenter une classe d'écouteur, la classe doit implémenter l' interface org.testng.ITestListener . Ces classes sont notifiées lors de l'exécution par TestNG lorsque le test démarre, se termine, échoue, saute ou réussit.
Reporters- Pour implémenter une classe de reporting, la classe doit implémenter une interface org.testng.IReporter . Ces classes sont appelées à la fin de toute l'exécution de la suite. L'objet contenant les informations de l'ensemble du test est passé à cette classe lorsqu'il est appelé.
Dans ce chapitre, nous aurons quatre exemples différents pour illustrer quatre cas différents de reporting et de journalisation -
Sr.No. | Cas et exemple |
---|---|
1 | Journalisation personnalisée Cet exemple illustre comment écrire votre propre enregistreur. |
2 | Reporter personnalisé Cet exemple illustre comment écrire votre propre journaliste. |
3 | Rapport HTML et XML Cet exemple illustre le rapport HTML et XML par défaut généré par TestNG. |
4 | Rapports JUnit Cet exemple illustre comment générer des rapports JUnit à partir de rapports TestNG. |
Dans ce chapitre, nous montrerons comment exécuter TestNG en utilisant ANT. Suivons les étapes ci-dessous -
Étape 1: Téléchargez Apache Ant
Téléchargez la dernière version d' Apache Ant
OS | Nom de l'archive |
---|---|
les fenêtres | apache-ant-1.8.4-bin.zip |
Linux | apache-ant-1.8.4-bin.tar.gz |
Mac | apache-ant-1.8.4-bin.tar.gz |
Étape 2: définir l'environnement Ant
Met le ANT_HOMEvariable d'environnement pour pointer vers l'emplacement du répertoire de base, où les bibliothèques ANT sont stockées sur votre machine. Supposons que nous ayons stocké les bibliothèques Ant dans le dossier apache-ant-1.8.4.
OS | Production |
---|---|
les fenêtres | Définissez la variable d'environnement ANT_HOME sur C: \ Program Files \ Apache Software Foundation \ apache-ant-1.8.4 |
Linux | Exporter ANT_HOME = / usr / local / apache-ant-1.8.4 |
Mac | Exporter ANT_HOME = / Bibliothèque / apache-ant-1.8.4 |
Ajoutez l'emplacement du compilateur Ant au chemin système comme suit -
OS | La description |
---|---|
les fenêtres | Ajoutez la chaîne% ANT_HOME \ bin à la fin de la variable système, Path. |
Linux | Exporter PATH =$PATH:$ANT_HOME / bin / |
Mac | Non requis. |
Étape 3: Téléchargez l'archive TestNG
Téléchargez les fichiers jar requis http://www.testng.org.
OS | Nom de l'archive |
---|---|
les fenêtres | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Étape 4: Créer une structure de projet
Créer un dossier TestNGWithAnt dans C:\>TestNG_WORKSPACE.
Créer un dossier src dans C:\>TestNG_WORKSPACE>TestNGWithAnt.
Créer un dossier test dans C:\>TestNG_WORKSPACE>TestNGWithAnt.
Créer un dossier lib dans C:\>TestNG_WORKSPACE>TestNGWithAnt.
Créer MessageUtil classe dans C:\>TestNG_WORKSPACE>TestNGWithAnt>src dossier.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public void printMessage() {
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Créer la classe TestMessageUtil dans C:\>TestNG_WORKSPACE>TestNGWithAnt>src dossier.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestMessageUtil {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Copiez testng-6.8.jar dans C:\>TestNG_WORKSPACE>TestNGWithAnt>lib dossier.
Créer ANT build.xml
Tout d'abord, nous devons définir la tâche TestNG Ant comme suit -
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
Ensuite, nous utiliserons <testng> tâche dans Ant pour exécuter nos cas de test TestNG.
le build.xml le fichier est le suivant -
<project name = "TestNGTest" default = "test" basedir = ".">
<!-- Define <testng> task -->
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
<property name = "testdir" location = "test" />
<property name = "srcdir" location = "src" />
<property name = "libdir" location = "lib" />
<property name = "full-compile" value="true" />
<path id = "classpath.base"/>
<path id = "classpath.test">
<fileset dir = "${libdir}"> <include name = "**/*.jar" /> </fileset> <pathelement location = "${testdir}" />
<pathelement location = "${srcdir}" /> <path refid = "classpath.base" /> </path> <target name = "clean" > <delete verbose="${full-compile}">
<fileset dir = "${testdir}" includes="**/*.class" /> </delete> </target> <target name = "compile" depends="clean"> <javac srcdir = "${srcdir}" destdir = "${testdir}" verbose="${full-compile}">
<classpath refid = "classpath.test"/>
</javac>
</target>
<target name = "test" depends="compile">
<testng outputdir = "${testdir}" classpathref="classpath.test"> <xmlfileset dir = "${srcdir}" includes="testng.xml"/>
</testng>
</target>
</project>
Exécutez la commande Ant suivante.
C:\TestNG_WORKSPACE\TestNGWithAnt>ant
Vérifiez la sortie.
test:
[testng] [TestNG] Running:
[testng] C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
[testng]
[testng] Inside testPrintMessage()
[testng] Manisha
[testng] Inside testSalutationMessage()
[testng] Hi!Manisha
[testng]
[testng] ===============================================
[testng] Plug ANT test Suite
[testng] Total tests run: 2, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
BUILD SUCCESSFUL
Total time: 1 second
Pour configurer TestNG avec Eclipse, suivez les étapes ci-dessous -
Étape 1: Téléchargez l'archive TestNG
Téléchargez la dernière version du fichier jar TestNG à partir de http://www.testng.org
OS | Nom de l'archive |
---|---|
les fenêtres | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Nous supposons que vous avez copié le fichier JAR ci-dessus dans le dossier C: \> TestNG.
Étape 2: définir l'environnement Eclipse
Ouvrez eclipse → faites un clic droit sur le projet et allez dans la propriété → Build Path → Configure Build Path et ajoutez le testng-6.8.jar dans les bibliothèques en utilisant le bouton Add External Jar .
Nous supposons que votre Eclipse a un plug-in TestNG intégré; s'il n'est pas disponible, veuillez obtenir la dernière version en utilisant le site de mise à jour.
Dans votre Eclipse IDE, sélectionnez Aide / Mises à jour logicielles / Rechercher et installer .
Recherchez de nouvelles fonctionnalités à installer.
Nouveau site distant.
Pour Eclipse 3.4 et supérieur, entrez http://beust.com/eclipse.
Pour Eclipse 3.3 et versions antérieures, entrez http://beust.com/eclipse1.
Assurez-vous que la case à cocher en regard de l'URL est cochée et cliquez sur Suivant .
Eclipse vous guidera ensuite tout au long du processus.
Maintenant, votre Eclipse est prêt pour le développement de cas de test TestNG.
Étape 3: Vérifiez l'installation de TestNG dans Eclipse
Créez un projet TestNGProject dans Eclipse à n'importe quel endroit.
Créez une classe MessageUtil à tester dans le projet.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
Créez une classe de test TestNGExample dans le projet.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestNGExample {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message,messageUtil.printMessage());
}
}
La structure du projet doit être la suivante -
Enfin, vérifiez la sortie du programme en cliquant avec le bouton droit sur le programme et en exécutant TestNG.
Vérifiez le résultat.