TestNG - Test parametrizzato

Un'altra caratteristica interessante disponibile in TestNG è parametric testing. Nella maggior parte dei casi, ti imbatterai in uno scenario in cui la logica aziendale richiede un numero estremamente variabile di test.Parameterized tests consentire agli sviluppatori di eseguire lo stesso test più e più volte utilizzando valori diversi.

TestNG ti consente di passare i parametri direttamente ai tuoi metodi di test in due modi diversi:

  • Con testng.xml
  • Con fornitori di dati

Passaggio di parametri con testng.xml

Con questa tecnica, si definiscono i parametri semplici nel file testng.xml e quindi si fa riferimento a tali parametri nei file di origine. Facciamo un esempio per dimostrare come utilizzare questa tecnica per passare i parametri.

Crea classe test case

  • Crea una classe di test java, ad esempio ParameterizedTest1.java.

  • Aggiungi il metodo di test parameterTest () alla tua classe di test. Questo metodo accetta una stringa come parametro di input.

  • Aggiungi l'annotazione @Parameters ("myName") a questo metodo. Al parametro verrà passato un valore da testng.xml, che vedremo nel passaggio successivo.

Crea un file di classe java denominato ParameterizedTest1.java in 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);
   }
}

Crea testng.xml

Crea testng.xml in C:\>TestNG_WORKSPACE per eseguire uno o più casi di 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>

Possiamo anche definire i parametri a livello <suite>. Supponiamo di aver definito myName a entrambi i livelli <suite> e <test>. In questi casi, si applicano le normali regole di ambito. Significa che qualsiasi classe all'interno del tag <test> vedrà il valore del parametro definito in <test>, mentre le classi nel resto del file testng.xml vedranno il valore definito in <suite>.

Compila la classe del test case usando javac.

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

Ora, esegui testng.xml, che eseguirà il metodo parameterTest . TestNG proverà a trovare un parametro chiamato myName prima nel tag <test>, quindi, se non riesce a trovarlo, cerca nel tag <suit> che lo racchiude.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

Verifica l'output.

Parameterized value is : manisha

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG proverà automaticamente a convertire il valore specificato in testng.xml nel tipo di parametro. Ecco i tipi supportati:

  • String
  • int/Integer
  • boolean/Boolean
  • byte/Byte
  • char/Character
  • double/Double
  • float/Float
  • long/Long
  • short/Short

Passaggio di parametri con i provider di dati

Quando è necessario passare parametri complessi o parametri che devono essere creati da Java (oggetti complessi, oggetti letti da un file di proprietà o da un database, ecc.), I parametri possono essere passati utilizzando Dataproviders.

Un provider di dati è un metodo annotato con @DataProvider. Questa annotazione ha un solo attributo di stringa: il suo nome. Se il nome non viene fornito, il nome del fornitore di dati assume automaticamente il nome del metodo. Un fornitore di dati restituisce una matrice di oggetti.

I seguenti esempi dimostrano come utilizzare i fornitori di dati. Il primo esempio riguarda @DataProvider che utilizza Vector, String o Integer come parametro e il secondo esempio riguarda @DataProvider che utilizza object come parametro.

Esempio 1

Qui, @DataProvider passa Integer e Boolean come parametro.

Create Java class

Crea una classe java chiamata PrimeNumberChecker.java. Questa classe controlla se il numero è primo. Crea questa classe inC:\>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

  • Crea una classe di test java, ad esempio ParamTestWithDataProvider1.java.

  • Definire il metodo primeNumbers (), definito come fornitore di dati utilizzando l'annotazione. Questo metodo restituisce un array di oggetti.

  • Aggiungi il metodo di test testPrimeNumberChecker () alla tua classe di test. Questo metodo accetta un numero intero e un booleano come parametri di input. Questo metodo convalida se il parametro passato è un numero primo.

  • Aggiungi l'annotazione @Test (dataProvider = "test1") a questo metodo. L'attributo dataProvider è mappato a "test1".

Crea un file di classe java denominato ParamTestWithDataProvider1.java in 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

Crea un file testng.xml C:\>TestNG_WORKSPACE per eseguire uno o più casi di 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>

Compilare la classe Test case utilizzando javac.

C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java

Ora, esegui testng.xml.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

Verifica l'output.

2 true
   6 false
   19 true
   22 false
   23 true

===============================================
   Suite1
   Total tests run: 5, Failures: 0, Skips: 0
===============================================

Esempio 2

Qui, @DataProvider passa Object come parametro.

Create Java class

Crea una classe java Bean.java, che è un oggetto semplice con metodi get / set, in 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

  • Crea una classe di test java, ad esempio ParamTestWithDataProvider2.java.

  • Definire il metodo primeNumbers (), che è definito come un fornitore di dati utilizzando l'annotazione. Questo metodo restituisce un array di oggetti.

  • Aggiungi il metodo di test testMethod () alla tua classe di test. Questo metodo accetta un oggetto bean come parametro.

  • Aggiungi l'annotazione @Test (dataProvider = "test1") a questo metodo. L'attributo dataProvider è mappato a "test1".

Crea un file di classe java denominato ParamTestWithDataProvider2.java in 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

Crea testng.xml in C:\>TestNG_WORKSPACE per eseguire uno o più casi di 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>

Compila la classe del test case usando javac.

C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java

Ora, esegui testng.xml.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

Verifica l'output.

hi I am the bean 111

===============================================
   Suite1
   Total tests run: 1, Failures: 0, Skips: 0
===============================================