TestNG - Prueba parametrizada

Otra característica interesante disponible en TestNG es parametric testing. En la mayoría de los casos, se encontrará con un escenario en el que la lógica empresarial requiere una cantidad muy variable de pruebas.Parameterized tests Permitir a los desarrolladores ejecutar la misma prueba una y otra vez utilizando valores diferentes.

TestNG le permite pasar parámetros directamente a sus métodos de prueba de dos formas diferentes:

  • Con testng.xml
  • Con proveedores de datos

Pasando parámetros con testng.xml

Con esta técnica, define los parámetros simples en el archivo testng.xml y luego hace referencia a esos parámetros en los archivos fuente. Tengamos un ejemplo para demostrar cómo utilizar esta técnica para pasar parámetros.

Crear clase de caso de prueba

  • Cree una clase de prueba de Java, por ejemplo, ParameterizedTest1.java.

  • Agregue el método de prueba parameterTest () a su clase de prueba. Este método toma una cadena como parámetro de entrada.

  • Agregue la anotación @Parameters ("myName") a este método. Al parámetro se le pasaría un valor de testng.xml, que veremos en el siguiente paso.

Cree un archivo de clase java llamado ParameterizedTest1.java en 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);
   }
}

Crear testng.xml

Cree testng.xml en C:\>TestNG_WORKSPACE para ejecutar caso (s) de prueba.

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

También podemos definir los parámetros a nivel <suite>. Supongamos que hemos definido myName en los niveles <suite> y <test>. En tales casos, se aplican reglas de alcance regulares. Significa que cualquier clase dentro de la etiqueta <test> verá el valor del parámetro definido en <test>, mientras que las clases en el resto del archivo testng.xml verán el valor definido en <suite>.

Compile la clase de caso de prueba usando javac.

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

Ahora, ejecute testng.xml, que ejecutará el método parameterTest . TestNG intentará encontrar un parámetro llamado myName primero en la etiqueta <test> y luego, si no puede encontrarlo, buscará en la etiqueta <suit> que lo encierra.

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

Verifique la salida.

Parameterized value is : manisha

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

TestNG intentará convertir automáticamente el valor especificado en testng.xml al tipo de su parámetro. Estos son los tipos admitidos:

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

Pasar parámetros con proveedores de datos

Cuando necesite pasar parámetros complejos o parámetros que deben crearse desde Java (objetos complejos, objetos leídos desde un archivo de propiedades o una base de datos, etc.), los parámetros se pueden pasar utilizando Dataproviders.

Un proveedor de datos es un método anotado con @DataProvider. Esta anotación tiene solo un atributo de cadena: su nombre. Si no se proporciona el nombre, el nombre del proveedor de datos cambia automáticamente al nombre del método. Un proveedor de datos devuelve una matriz de objetos.

Los siguientes ejemplos demuestran cómo utilizar los proveedores de datos. El primer ejemplo es sobre @DataProvider usando Vector, String o Integer como parámetro, y el segundo ejemplo es sobre @DataProvider usando object como parámetro.

Ejemplo 1

Aquí, @DataProvider pasa Integer y Boolean como parámetro.

Create Java class

Cree una clase de Java llamada PrimeNumberChecker.java. Esta clase verifica si el número es primo. Crea esta clase enC:\>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

  • Cree una clase de prueba de Java, digamos, ParamTestWithDataProvider1.java.

  • Defina el método primeNumbers (), que se define como un proveedor de datos mediante la anotación. Este método devuelve una matriz de objetos.

  • Agregue el método de prueba testPrimeNumberChecker () a su clase de prueba. Este método toma un entero y un booleano como parámetros de entrada. Este método valida si el parámetro pasado es un número primo.

  • Agregue la anotación @Test (dataProvider = "test1") a este método. El atributo dataProvider se asigna a "test1".

Cree un archivo de clase java llamado ParamTestWithDataProvider1.java en 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 testng.xml C:\>TestNG_WORKSPACE para ejecutar casos de prueba.

<?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 la clase de caso de prueba con javac.

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

Ahora, ejecute testng.xml.

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

Verifique la salida.

2 true
   6 false
   19 true
   22 false
   23 true

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

Ejemplo 2

Aquí, @DataProvider pasa Object como parámetro.

Create Java class

Cree una clase Java Bean.java, que es un objeto simple con métodos get / set, en 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

  • Cree una clase de prueba de Java, digamos, ParamTestWithDataProvider2.java.

  • Defina el método primeNumbers (), que se define como un proveedor de datos mediante la anotación. Este método devuelve una matriz de objeto.

  • Agregue el método de prueba testMethod () a su clase de prueba. Este método toma un objeto bean como parámetro.

  • Agregue la anotación @Test (dataProvider = "test1") a este método. El atributo dataProvider se asigna a "test1".

Cree un archivo de clase java llamado ParamTestWithDataProvider2.java en 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

Cree testng.xml en C:\>TestNG_WORKSPACE para ejecutar caso (s) de prueba.

<?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 la clase de caso de prueba usando javac.

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

Ahora, ejecute testng.xml.

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

Verifique la salida.

hi I am the bean 111

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