TestNG - Teste Parametrizado
Outro recurso interessante disponível no TestNG é parametric testing. Na maioria dos casos, você se deparará com um cenário em que a lógica de negócios requer um número extremamente variável de testes.Parameterized tests permitem que os desenvolvedores executem o mesmo teste repetidamente usando valores diferentes.
TestNG permite que você passe parâmetros diretamente para seus métodos de teste de duas maneiras diferentes -
- Com testng.xml
- Com provedores de dados
Passando parâmetros com testng.xml
Com essa técnica, você define os parâmetros simples no arquivo testng.xml e, a seguir, faz referência a esses parâmetros nos arquivos de origem. Vamos ter um exemplo para demonstrar como usar essa técnica para passar parâmetros.
Criar classe de caso de teste
Crie uma classe de teste java, digamos, ParameterizedTest1.java.
Adicione o método de teste parameterTest () à sua classe de teste. Este método usa uma string como parâmetro de entrada.
Adicione a anotação @Parameters ("myName") a este método. O parâmetro seria passado um valor de testng.xml, que veremos na próxima etapa.
Crie um arquivo de classe java chamado ParameterizedTest1.java dentro 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);
}
}
Crie testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?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>
Também podemos definir os parâmetros no nível <suite>. Suponha que tenhamos definido meuNome nos níveis <suite> e <test>. Nesses casos, as regras regulares de escopo se aplicam. Isso significa que qualquer classe dentro da tag <test> verá o valor do parâmetro definido em <test>, enquanto as classes no restante do arquivo testng.xml verão o valor definido em <suite>.
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
Agora, execute testng.xml, que executará o método parameterTest . TestNG tentará encontrar um parâmetro denominado myName primeiro na tag <test> e, em seguida, se não puder encontrá-lo, ele pesquisará na tag <suit> que o envolve.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
Parameterized value is : manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG tentará automaticamente converter o valor especificado em testng.xml para o tipo de seu parâmetro. Aqui estão os tipos suportados -
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
Passando parâmetros com provedores de dados
Quando você precisa passar parâmetros complexos ou parâmetros que precisam ser criados em Java (objetos complexos, objetos lidos de um arquivo de propriedades ou banco de dados, etc.), os parâmetros podem ser passados usando provedores de dados.
Um provedor de dados é um método anotado com @DataProvider. Esta anotação possui apenas um atributo de string: seu nome. Se o nome não for fornecido, o nome do provedor de dados será automaticamente padronizado como o nome do método. Um provedor de dados retorna uma matriz de objetos.
Os exemplos a seguir demonstram como usar provedores de dados. O primeiro exemplo é sobre @DataProvider usando Vector, String ou Integer como parâmetro, e o segundo exemplo é sobre @DataProvider usando objeto como parâmetro.
Exemplo 1
Aqui, o @DataProvider passa Inteiro e Booleano como parâmetro.
Create Java class
Crie uma classe java chamada PrimeNumberChecker.java. Esta classe verifica se o número é primo. Crie esta classe emC:\>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
Crie uma classe de teste java, digamos, ParamTestWithDataProvider1.java.
Defina o método primeNumbers (), que é definido como um provedor de dados usando a anotação. Este método retorna uma matriz de objetos.
Adicione o método de teste testPrimeNumberChecker () à sua classe de teste. Este método usa um inteiro e um booleano como parâmetros de entrada. Este método valida se o parâmetro passado é um número primo.
Adicione a anotação @Test (dataProvider = "test1") a este método. O atributo dataProvider é mapeado para "test1".
Crie um arquivo de classe java chamado ParamTestWithDataProvider1.java dentro 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
Crie um testng.xml C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?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>
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
Agora, execute testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
2 true
6 false
19 true
22 false
23 true
===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================
Exemplo 2
Aqui, o @DataProvider passa Object como parâmetro.
Create Java class
Crie uma classe java Bean.java, que é um objeto simples com métodos get / set, em 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
Crie uma classe de teste java, digamos, ParamTestWithDataProvider2.java.
Defina o método primeNumbers (), que é definido como um provedor de dados usando anotação. Este método retorna uma matriz de objeto.
Adicione o método de teste testMethod () à sua classe de teste. Este método usa um bean de objeto como parâmetro.
Adicione a anotação @Test (dataProvider = "test1") a este método. O atributo dataProvider é mapeado para "test1".
Crie um arquivo de classe java chamado ParamTestWithDataProvider2.java em 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
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?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>
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
Agora, execute testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
hi I am the bean 111
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================