A medida que creamos software, siempre deseamos que funcione de manera diferente con un conjunto de datos diferente. Cuando se trata de probar el mismo software, no podemos ser injustos al probarlo con un solo conjunto de datos. Aquí nuevamente, necesitamos verificar que nuestro sistema esté tomando todo el conjunto de combinaciones que se espera que sean compatibles. Para eso, necesitamos parametrizar nuestros scipts de prueba. Aquí viene la parametrización en la imagen.
Parametrización en selenio
La parametrización en Selenium es un proceso para parametrizar los scripts de prueba con el fin de pasar varios datos a la aplicación en tiempo de ejecución. Es una estrategia de ejecución que ejecuta automáticamente casos de prueba varias veces utilizando diferentes valores. El concepto que se logra mediante la parametrización de los scripts de prueba se denomina Pruebas controladas por datos .
En este tutorial, aprenderá:
- Tipo de parametrización en TestNG-
- Anotación de parámetros con Testng.xml
- Solución de problemas
- Parámetros usando Dataprovider
- Invocar DataProvider desde una clase diferente
- Tipos de parámetros en el proveedor de datos
Tipo de parametrización en TestNG-
Para que la parametrización sea más clara, revisaremos las opciones de parametrización en uno de los marcos más populares para Selenium Webdriver: TestNG .
Hay dos formas de lograr la parametrización en TestNG
- Con la ayuda de la anotación de parámetros y el archivo XML TestNG .
- Con la ayuda de la anotación DataProvider .
Los parámetros de Testng.xml pueden ser de nivel de suite o de prueba
El parámetro de DataProvider puede tomar Method e ITestContext como parámetro.
Estudiémoslos en detalle -
Anotación de parámetros en TestNG
La anotación de parámetros en TestNG es un método utilizado para pasar valores a los métodos de prueba como argumentos utilizando un archivo .xml. Es posible que se solicite a los usuarios que pasen los valores a los métodos de prueba durante el tiempo de ejecución. El método de anotación @Parameters se puede utilizar en cualquier método que tenga anotación @Test, @Before, @After o @Factory.
Anotación de parámetros con Testng.xml
Seleccione la parametrización usando anotaciones cuando quiera lidiar con la complejidad y el número de combinaciones de entrada sea menor.
Veamos como funciona esto
Escenario de prueba
Paso 1) Inicie el navegador y vaya a Google.com
Paso 2) Ingrese una palabra clave de búsqueda
Paso 3) Verifique que el valor ingresado sea el mismo que el proporcionado por nuestros datos de prueba
Paso 4) Repita 2 y 3 hasta que se ingresen todos los valores
Autor de la prueba | Clave de búsqueda |
Guru99 | India |
Krishna | EE.UU |
Bhupesh | porcelana |
A continuación se muestra un ejemplo de cómo hacerlo SIN parámetros
parámetros del paquete;import org.testng.annotations.Test;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;public class NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Controlador WebDriver;@Pruebapublic void testNoParameter () lanza InterruptedException {String author = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Buscando texto en el cuadro de texto de GooglesearchText.sendKeys (searchKey);System.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);System.out.println ("El hilo se suspenderá ahora");Hilo.sueño (3000);System.out.println ("Valor en el cuadro de búsqueda de Google =" + searchText.getAttribute ("valor") + "::: Valor dado por input =" + searchKey);// verificar el valor en el cuadro de búsqueda de GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valor"). EqualsIgnoreCase (searchKey));}}
Un estudio, el ejemplo anterior. Imagínese lo complejo que se volverá el código cuando hagamos esto para 3 combinaciones de entrada
Ahora, parametricemos esto usando TestNG
Para hacerlo, necesitará
- Cree un archivo XML que almacenará los parámetros.
- En la prueba, agregue la anotación @Parameters
Aquí está el código completo
Nivel de prueba TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Archivo ParameterWithTestNGXML.java
parámetros del paquete;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.annotations.Optional;import org.testng.annotations.Parameters;import org.testng.annotations.Test;public class ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Controlador WebDriver;@Prueba@Parameters ({"autor", "clave de búsqueda"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) lanza InterruptedException {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Buscando texto en el cuadro de texto de GooglesearchText.sendKeys (searchKey);System.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);System.out.println ("El hilo se suspenderá ahora");Hilo.sueño (3000);System.out.println ("Valor en el cuadro de búsqueda de Google =" + searchText.getAttribute ("valor") + "::: Valor dado por input =" + searchKey);// verificar el valor en el cuadro de búsqueda de GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valor"). EqualsIgnoreCase (searchKey));}}
Instrucciones para ejecutar el script, seleccionar el archivo XML y ejecutar como Test NG Suite
Haga clic derecho en el archivo .xml -> Ejecutar como -> Testng Suite (Nota: Suite)
Ahora, los parámetros se pueden definir en 2 niveles
- Nivel de suite: los parámetros dentro de la etiqueta
del archivo XML TestNG serán un parámetro de nivel de suite. - Nivel de prueba: los parámetros dentro de la etiqueta
del archivo XML de prueba serán un parámetro de nivel de prueba.
Aquí está la misma prueba con parámetros de nivel de suite
NOTA: En caso de que el nombre del parámetro sea el mismo en el nivel de suite y en el nivel de prueba, el parámetro de nivel de prueba tendrá preferencia sobre el nivel de suite. Entonces, en ese caso, todas las clases dentro de ese nivel de prueba compartirán el parámetro anulado, y otras clases que están fuera del nivel de prueba compartirán el parámetro de nivel de suite.
Solución de problemas
Problema # 1 El valor del parámetro en testng.xml no se puede convertir al parámetro del método de prueba correspondiente, arrojará un error.
Considere el siguiente ejemplo
Aquí, el atributo 'autor' es igual a 'Guru99' que es una cadena y en el método de prueba correspondiente espera un valor entero, por lo que obtendremos una excepción aquí.
Problema # 2 Sus @Parameters no tienen un valor correspondiente en testing.xml.
Puede resolver esta situación agregando @optional annotation en el parámetro correspondiente en el método de prueba.
Problema n. ° 3: desea probar varios valores del mismo parámetro usando Testng.xml
¡La respuesta simple es que esto no se puede hacer! Puede tener varios parámetros diferentes, pero cada parámetro solo puede tener un valor único. Esto ayuda a evitar la codificación de valores en el script. Esto hace que el código sea reutilizable. Piense en ello como archivos de configuración para su secuencia de comandos. Si desea utilizar varios valores para un parámetro, utilice DataProviders
Proveedor de datos en TestNG
El proveedor de datos en TestNG es un método que se utiliza cuando un usuario necesita pasar parámetros complejos. Los parámetros complejos deben crearse a partir de Java, como los objetos complejos, los objetos de archivos de propiedades o de una base de datos pueden pasarse mediante el método del proveedor de datos. El método está anotado por @DataProvider y devuelve una matriz de objetos.
Parámetros usando Dataprovider
La anotación de @Parameters es fácil, pero para probar con múltiples conjuntos de datos, necesitamos usar Data Provider.
Para llenar miles de formularios web utilizando nuestro marco de prueba, necesitamos una metodología diferente que pueda brindarnos un conjunto de datos muy grande en un solo flujo de ejecución.
Este concepto basado en datos se logra mediante la anotación @DataProvider en TestNG.
Tiene un solo atributo 'nombre' . Si no especifica el atributo de nombre, el nombre del proveedor de datos será el mismo que el nombre del método correspondiente.
El proveedor de datos devuelve un objeto JAVA bidimensional al método de prueba y el método de prueba invocará M veces en un tipo M * N de matriz de objetos. Por ejemplo, si DataProvider devuelve una matriz de 2 * 3 objetos, el caso de prueba correspondiente se invocará 2 veces con 3 parámetros cada vez.
Ejemplo completo
parámetros del paquete;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByDataprovider {Controlador WebDriver;String driverPath = "C: \\ geckodriver.exe";@AntesTestconfiguración de vacío público () {// Crea el objeto del controlador de FirefoxSystem.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Caso de prueba para verificar el cuadro de búsqueda de Google* @param autor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) lanza InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// valor de búsqueda en el cuadro de búsqueda de GooglesearchText.sendKeys (searchKey);System.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifica si el valor en el cuadro de búsqueda de Google es correctoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] donde la primera columna contiene 'autor'* y la segunda columna contiene 'searchKey'* /@DataProvider (nombre = "SearchProvider")objeto público [] [] getDataFromDataprovider () {devolver nuevo objeto [] []{{"Guru99", "India"},{"Krishna", "Reino Unido"},{"Bhupesh", "EE. UU."}};}}
Invocar DataProvider desde una clase diferente
De forma predeterminada, DataProvider reside en la misma clase donde está el método de prueba o su clase base. Para ponerlo en otra clase, necesitamos hacer que el método del proveedor de datos sea estático y en el método de prueba necesitamos agregar un atributo dataProviderClass en la anotación @Test .
Ejemplo de código
TestClass ParameterDataproviderWithClassLevel.java
parámetros del paquete;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;public class ParameterDataproviderWithClassLevel {Controlador WebDriver;String driverPath = "C: \\ geckodriver.exe";@AntesTestconfiguración de vacío público () {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String author, String searchKey) lanza InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Buscar texto en el cuadro de texto de GooglesearchText.sendKeys (searchKey);System.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);// obtener texto del cuadro de búsquedaString testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifica si el cuadro de búsqueda tiene el valor correctoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parámetros del paquete;import org.testng.annotations.DataProvider;clase pública DataproviderClass {@DataProvider (nombre = "SearchProvider")Objeto estático público [] [] getDataFromDataprovider () {devolver nuevo objeto [] [] {{"Guru99", "India"},{"Krishna", "Reino Unido"},{"Bhupesh", "EE. UU."}};}}
Tipos de parámetros en el proveedor de datos
Hay dos tipos de parámetros admitidos por el método DataProvider.
Método : si el SAME DataProvider debe comportarse de manera diferente con un método de prueba diferente, use el parámetro Método.
En el siguiente ejemplo,
- Comprobamos si el nombre del método es testMethodA.
- Si es así, devuelva un conjunto de valores
- De lo contrario, devuelve otro conjunto de valor
parámetros del paquete;import java.lang.reflect.Method;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByMethodInDataprovider {Controlador WebDriver;String driverPath = "C: \\ geckodriver.exe";@AntesTestconfiguración de vacío público () {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) lanza InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Buscar texto en el cuadro de búsquedasearchText.sendKeys (searchKey);// Imprimir autor y cadena de búsquedaSystem.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifique si el cuadro de texto de Google muestra el valor correctoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) lanza InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Buscar texto en el cuadro de búsquedasearchText.sendKeys (searchKey);// Imprimir solo la cadena de búsquedaSystem.out.println ("Bienvenido -> Usuario desconocido Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifique si el cuadro de texto de Google muestra el valor correctoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aquí DataProvider devuelve el valor sobre la base del nombre del método de prueba* @param m* @regreso** /@DataProvider (nombre = "SearchProvider")Objeto público [] [] getDataFromDataprovider (Método m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {devolver nuevo objeto [] [] {{"Guru99", "India"},{"Krishna", "Reino Unido"},{"Bhupesh", "EE. UU."}};}demás{devolver nuevo objeto [] [] {{"Canadá"},{"Rusia"},{"Japón"}};}}}
Aquí está la salida
ITestContext : se puede usar para crear diferentes parámetros para casos de prueba basados en grupos.
En la vida real, puede utilizar ITestContext para variar los valores de los parámetros según los métodos de prueba, los hosts y las configuraciones de la prueba.
En el siguiente ejemplo de código
- Tenemos 2 grupos A y B
- Cada método de prueba se asigna a un grupo
- Si el valor del grupo es A, se devuelve un conjunto de datos en particular
- Si el valor del grupo es B, se devuelve otro conjunto de datos
parámetros del paquete;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.ITestContext;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByITestContextInDataprovider {Controlador WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupos = {"A", "B"})configuración de vacío público () {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", grupos = "A")public void testMethodA (String author, String searchKey) lanza InterruptedException {{// buscar cuadro de texto de googleWebElement searchText = driver.findElement (By.name ("q"));// busca un valor en élsearchText.sendKeys (searchKey);System.out.println ("Bienvenido ->" + autor + "Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verificar el valor correcto en el cuadro de búsquedaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", grupos = "B")public void testMethodB (String searchKey) lanza InterruptedException {{// buscar cuadro de búsqueda de GoogleWebElement searchText = driver.findElement (By.name ("q"));// busca un valor en élsearchText.sendKeys (searchKey);System.out.println ("Bienvenido -> Usuario desconocido Su clave de búsqueda es ->" + searchKey);Hilo.sueño (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verificar el valor correcto en el cuadro de búsquedaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aquí, el DAtaProvider proporcionará una matriz de objetos sobre la base de ITestContext* @param c* @regreso* /@DataProvider (nombre = "SearchProvider")objeto público [] [] getDataFromDataprovider (ITestContext c) {Objeto [] [] groupArray = null;para (Grupo de cadenas: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nuevo objeto [] [] {{"Guru99", "India"},{"Krishna", "Reino Unido"},{"Bhupesh", "EE. UU."}};descanso;}else if (group.equalsIgnoreCase ("B")){groupArray = nuevo objeto [] [] {{"Canadá"},{"Rusia"},{"Japón"}};}descanso;}return groupArray;}}
Nota: Si ejecuta directamente su clase de prueba, primero llamará al proveedor de datos que no puede obtener información de grupos ya que los grupos no están disponibles. Pero en cambio, si llama a esta clase a través de testng.xml, tendrá información de grupos disponible con ITestContext. Utilice el siguiente XML para llamar a la prueba
Resumen :
- Se requiere la parametrización para crear pruebas controladas por datos .
- TestNG admite dos tipos de parametrización, usando @ Parameter + TestNG.xml y usando @DataProvider
- En @ Parameter + TestNG.xml, los parámetros se pueden colocar en el nivel de suite y en el nivel de prueba. Si
El mismo nombre de parámetro se declara en ambos lugares; El parámetro de nivel de prueba tendrá preferencia sobre el parámetro de nivel de traje.
- usando @ Parameter + TestNG.xml solo se puede establecer un valor a la vez, pero @DataProvider devuelve una matriz 2d de Object .
- Si DataProvider está presente en la clase diferente, entonces la clase donde reside el método de prueba, DataProvider debe ser un método estático .
- Hay dos parámetros admitidos por DataProvider : Method e ITestContext.