TestNG - Test paramétré

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 recherchera dans la balise <suit> qui l'entoure.

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 avez besoin de passer 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 à l'aide de 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
===============================================