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
===============================================