Furnizor de date și TestNG XML: parametrizare în Selenium(Exemplu)

Pe măsură ce creăm software, ne dorim întotdeauna să funcționeze diferit cu un set diferit de date. Cand vine vorba de Testarea aceeași bucată de software, nu putem fi nedrept să-l testăm cu un singur set de date. Din nou, trebuie să verificăm că sistemul nostru acceptă toate seturile de combinații pe care se așteaptă să le accepte. Pentru asta, trebuie să parametrizăm scripturile noastre de testare. Aici vine parametrizarea în imagine.

Parametrizare în Selenium

Parametrizare în Selenium este un proces de parametrizare a scripturilor de testare pentru a transmite mai multe date aplicației în timpul execuției. Este o strategie de execuție care rulează automat cazuri de testare de mai multe ori folosind valori diferite. Conceptul realizat prin parametrizarea scripturilor de testare este numit Testare bazată pe date.

Tipul de parametrizare în TestNG-

Pentru a face parametrizarea mai clară, vom parcurge opțiunile de parametrizare într-unul dintre cele mai populare cadru pentru Selenium Webdriver – TestNG.

Sunt doua feluri prin care putem realiza parametrizarea în TestNG

  1. Cu ajutorul parametrii adnotare si TestNG XML fișier.

    Tipul de parametrizare în TestNG

  2. Cu ajutorul Furnizor de date adnotare.

    Tipul de parametrizare în TestNG

Tipul de parametrizare în TestNG

Parametrii din Testng.xml pot fi la nivel de suită sau de test

Parametrul de la DataProvider poate lua Method și ITestContext ca parametru.

Să le studiem în detaliu -

Parametri Adnotare în TestNG

Parametri Adnotare în TestNG este o metodă folosită pentru a transmite valori metodelor de testare ca argumente folosind fișierul .xml. Utilizatorilor li se poate cere să transmită valorile metodelor de testare în timpul rulării. Metoda de adnotare @Parameters poate fi utilizată în orice metodă care are @Test, @Before, @After sau @Factory.

Adnotarea parametrilor cu Testng.xml

Selectați parametrizarea folosind adnotări atunci când doriți să vă ocupați de complexitate și numărul de combinații de intrare este mai mic.

Să vedem cum funcționează

Scenariu de testare

Pasul 1) Lansați browserul și accesați Google.com

Pasul 2) Introduceți un cuvânt cheie de căutare

Adnotare parametri cu Testng.Xml

Pasul 3) Verificați că valoarea introdusă este aceeași cu cea furnizată de datele noastre de testare

Pasul 4) Repetați 2 și 3 până când sunt introduse toate valorile

Autorul testului Tasta de căutare
Guru99 India
Krishna USA
Bhupesh China

Iată un exemplu despre cum să o faci FĂRĂ parametri

package parameters;

import org.testng.annotations.Test;
import org.testng.AssertJUnit;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class NoParameterWithTestNGXML {
	String driverPath = "C:\\geckodriver.exe";
	WebDriver driver;
    
    @Test
    public void testNoParameter() throws InterruptedException{
        String author = "guru99";
        String searchKey = "india";
        
        System.setProperty("webdriver.gecko.driver", driverPath);        
        driver= new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        driver.get("https://google.com");
        WebElement searchText = driver.findElement(By.name("q"));
        //Searching text in google text box
        searchText.sendKeys(searchKey);
        
        System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
                System.out.println("Thread will sleep now");
        
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey);
        //verifying the value in google search box
        AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey));
}
}

Un studiu, exemplul de mai sus. Imaginează-ți cât de complex va deveni codul când facem asta pentru 3 combinații de intrare

Acum, să parametrizăm acest lucru folosind TestNG

Pentru a face acest lucru, va trebui

  • Creați un fișier XML care va stoca parametrii
  • În test, adăugați adnotarea @Parameters

Adnotare parametri cu Testng.Xml

Aici este codul complet

Nivelul testului TestNG.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" >
<parameter name="author" value="Guru99" />
<parameter name="searchKey" value="India" />
<test name="testGuru">
<parameter name="searchKey" value="UK" />
<classes>
<class name="parameters.ParameterWithTestNGXML">
</class>
</classes>
</test>
</suite>

ParameterWithTestNGFișier XML.java

package parameters;

import org.testng.AssertJUnit;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import 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";
	WebDriver driver;
    @Test
    @Parameters({"author","searchKey"})
    public void testParameterWithXML( @Optional("Abc") String author,String searchKey) throws InterruptedException{

        System.setProperty("webdriver.gecko.driver", driverPath);
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://google.com");

        WebElement searchText = driver.findElement(By.name("q"));
        //Searching text in google text box
        searchText.sendKeys(searchKey);

        System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
        System.out.println("Thread will sleep now");
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey);
        //verifying the value in google search box
        AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey));

}
}

Instrucțiuni pentru a rula scriptul, selectați fișierul XML și Run as Test NG Suite

Faceți clic dreapta pe fișierul .xml -> Run as -> Testng Suită (Notă: Suită)

ParameterWithTestNGFișier XML.java

Acum, parametrii pot fi definiți la 2 niveluri

  1. Nivel de suită – Parametrii din interiorul eticheta de TestNG Fișierul XML va fi un parametru la nivel de suită.
  2. Nivel de testare — Parametrii din interiorul eticheta fișierului XML de testare va fi un parametru de nivel de testare.

Iată același test cu parametrii la nivel de suită

ParameterWithTestNGFișier XML.java

NOTĂ: În cazul în care numele parametrului este același la nivel de suită și la nivelul de test, atunci parametrul de nivel de test va primi preferință față de nivelul de suită. Deci, în acest caz, toate clasele din acel nivel de test vor împărtăși parametrul suprascris, iar alte clase care se află în afara nivelului de test vor împărtăși parametrul la nivel de suită.

ParameterWithTestNGFișier XML.java

Depanare

Emisiune # 1 Valoarea parametrului din testng.xml nu poate fi transformată în parametrul metodei de testare corespunzătoare, aceasta va genera o eroare.

Luați în considerare următorul exemplu

Depanare

Aici, atributul „autor” este egal cu „Guru99”, care este un șir, iar în metoda de testare corespunzătoare se așteaptă o valoare întreagă, așa că vom obține o excepție aici.

Emisiune # 2 @Parameters dvs. nu au o valoare corespunzătoare în testing.xml.

Puteți rezolva această situație adăugând @optional adnotare în parametrul corespunzător din metoda de testare.

Depanare

Problema # 3: Doriți să testați mai multe valori ale aceluiași parametru folosind Testng.xml

Răspunsul simplu este că acest lucru nu se poate face! Puteți avea mai mulți parametri diferiți, dar fiecare parametru poate avea o singură valoare. Acest lucru ajută la prevenirea codării hardcodării valorilor în script. Acest lucru face codul reutilizabil. Gândiți-vă la el ca fișiere de configurare pentru scriptul dvs. Dacă doriți să utilizați mai multe valori pentru un parametru, utilizați DataProviders

Furnizor de date în TestNG

Furnizor de date în TestNG este o metodă folosită atunci când un utilizator trebuie să treacă parametri complecși. Parametrii complexi trebuie să fie creați din Java precum obiectele complexe, obiectele din fișierele de proprietate sau dintr-o bază de date pot fi transmise prin metoda furnizorului de date. Metoda este adnotată de @DataProvider și returnează o matrice de obiecte.

Parametri folosind Dataprovider

Adnotarea @Parameters este ușoară, dar pentru a testa cu mai multe seturi de date trebuie să folosim Data Provider.

Pentru a completa mii de formulare web folosind cadrul nostru de testare, avem nevoie de o metodologie diferită care ne poate oferi un set de date foarte mare într-un singur flux de execuție.

Acest concept bazat pe date este realizat prin @DataProvider adnotare în TestNG.

Parametri folosind Dataprovider

Are doar unul Numele atributului'. Dacă nu specificați atributul nume, atunci numele DataProvider va fi același cu numele metodei corespunzătoare.

Furnizorul de date revine un obiect JAVA bidimensional la metoda de testare și la metoda de testare, va invoca de M ori într-o matrice de obiecte de tip M*N. De exemplu, dacă DataProvider returnează o matrice de 2*3 obiecte, cazul de testare corespunzător va fi invocat de 2 ori cu 3 parametri de fiecare dată.

Parametri folosind Dataprovider

Exemplu complet

Parametri folosind Dataprovider

package parameters;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import 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 {
    WebDriver driver;
    String driverPath = "C:\\geckodriver.exe";

    @BeforeTest
    public void setup(){
        //Create firefox driver object
         System.setProperty("webdriver.gecko.driver", driverPath);
         driver = new FirefoxDriver();
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         driver.get("https://google.com");
    }
 
    /** Test case to verify google search box
     * @param author
     * @param searchKey
     * @throws InterruptedException
     */

    @Test(dataProvider="SearchProvider")
    public void testMethod(String author,String searchKey) throws InterruptedException{
    {
        WebElement searchText = driver.findElement(By.name("q"));
        //search value in google searchbox
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getAttribute("value");
        System.out.println(testValue +"::::"+searchKey);
        searchText.clear();
        //Verify if the value in google search box is correct
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }
    }
    /**
     * @return Object[][] where first column contains 'author'
     * and second column contains 'searchKey'
     */

    @DataProvider(name="SearchProvider")
    public Object[][] getDataFromDataprovider(){
    return new Object[][] 
    	{
            { "Guru99", "India" },
            { "Krishna", "UK" },
            { "Bhupesh", "USA" }
        };

    }

}

Invocați DataProvider din clasă diferită

În mod implicit, DataProvider rezidă în aceeași clasă în care este metoda de testare sau în clasa sa de bază. Pentru a o pune într-o altă clasă, trebuie să facem ca metoda furnizorului de date să fie statică, iar în metoda de testare trebuie să adăugăm un atribut dataProviderClass in @Test adnotare.

Invocați DataProvider dintr-o clasă diferită

Exemplu de cod

Invocați DataProvider dintr-o clasă diferită

TestClass ParameterDataproviderWithClassLevel.java

package parameters;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class ParameterDataproviderWithClassLevel {
    WebDriver driver;
    String driverPath = "C:\\geckodriver.exe";
    
 	@BeforeTest
    public void setup(){
 		System.setProperty("webdriver.gecko.driver", driverPath);
		driver = new 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) throws InterruptedException{
        
        WebElement searchText = driver.findElement(By.name("q"));
        //Search text in google text box
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
        Thread.sleep(3000);
        //get text from search box
        String testValue = searchText.getAttribute("value");
        System.out.println(testValue +"::::"+searchKey);
        searchText.clear();
        //verify if search box has correct value
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
   }
}

DataproviderClass.java

package parameters;

import org.testng.annotations.DataProvider;
public class DataproviderClass {
        @DataProvider(name="SearchProvider")
        public static Object[][] getDataFromDataprovider(){
            return new Object[][] {
                { "Guru99", "India" },
                { "Krishna", "UK" },
                { "Bhupesh", "USA" }
            };  
}}

Tipuri de parametri în Dataprovider

Există două tipuri de parametri acceptați de metoda DataProvider.

Metodă- Dacă LA FEL DataProvider ar trebui să se comporte diferit cu o metodă de testare diferită, utilizați parametrul Method.

Tipuri de parametri în Dataprovider

În exemplul următor,

  • Verificăm dacă numele metodei este testMethodA.
  • Dacă da, returnați un set de valori
  • Altfel returnează un alt set de valori
package parameters;

import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import 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{

    WebDriver driver;
    String driverPath = "C:\\geckodriver.exe";
     
    @BeforeTest
    public void setup(){
    	System.setProperty("webdriver.gecko.driver", driverPath);
    	driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://google.com");
    }

    @Test(dataProvider="SearchProvider")
    public void testMethodA(String author,String searchKey) throws InterruptedException{
        
    	WebElement searchText = driver.findElement(By.name("q"));
        //Search text in search box
        searchText.sendKeys(searchKey);
        //Print author and search string
        System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getAttribute("value");
        System.out.println(testValue +"::::"+searchKey);
        searchText.clear();
        //Verify if google text box is showing correct value
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }
      
    @Test(dataProvider="SearchProvider")
    public void testMethodB(String searchKey) throws InterruptedException{
        {
        	WebElement searchText = driver.findElement(By.name("q"));
            //Search text in search box
            searchText.sendKeys(searchKey);
            //Print only search string
            System.out.println("Welcome ->Unknown user Your search key is->"+searchKey);
            Thread.sleep(3000);
            String testValue = searchText.getAttribute("value");
            System.out.println(testValue +"::::"+searchKey);
            searchText.clear();
            //Verify if google text box is showing correct value
            Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
        }
    }    
    /**
     * Here DataProvider returning value on the basis of test method name
     * @param m
     * @return
     **/

    @DataProvider(name="SearchProvider")
    public Object[][] getDataFromDataprovider(Method m){
        if(m.getName().equalsIgnoreCase("testMethodA")){
        return new Object[][] {
                { "Guru99", "India" },
                { "Krishna", "UK" },
                { "Bhupesh", "USA" }
            };}
        else{
        return new Object[][] {
                { "Canada" },
                { "Russia" },
                { "Japan" }
            };}       
    }
}

Aici este rezultatul

Tipuri de parametri în Dataprovider

ITestContext– Se poate folosi pentru a crea diferiți parametri pentru cazurile de testare bazate pe grupuri.

În viața reală, puteți utiliza ITestContext pentru a varia valorile parametrilor în funcție de metodele de testare, gazde, configurații ale testului.

Tipuri de parametri în Dataprovider

În următorul exemplu de cod

  • Avem 2 grupe A & B
  • Fiecare metodă de testare este atribuită unui grup
  • Dacă valoarea grupului este A, este returnat un anumit set de date
  • Dacă valoarea grupului este B, este returnat un alt set de date
package parameters;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import 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 {
	WebDriver driver;
	String driverPath = "C:\\geckodriver.exe";
	@BeforeTest(groups={"A","B"})
	public void setup(){
		System.setProperty("webdriver.gecko.driver", driverPath);
		  	driver = new FirefoxDriver();
			driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
			driver.get("https://google.com");
	}
	
	@Test(dataProvider="SearchProvider",groups="A")
	public void testMethodA(String author,String searchKey) throws InterruptedException{
		{
		  //search google textbox
			WebElement searchText = driver.findElement(By.name("q"));
			//search a value on it
			searchText.sendKeys(searchKey);
			System.out.println("Welcome ->"+author+" Your search key is->"+searchKey);
			Thread.sleep(3000);
			String testValue = searchText.getAttribute("value");
			System.out.println(testValue +"::::"+searchKey);
			searchText.clear();
			//verify correct value in searchbox
			Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
	}
	}
	
	@Test(dataProvider="SearchProvider",groups="B")
	public void testMethodB(String searchKey) throws InterruptedException{
		{
		  //find google search box
			WebElement searchText = driver.findElement(By.name("q"));
			//search a value on it
			searchText.sendKeys(searchKey);
			System.out.println("Welcome ->Unknown user Your search key is->"+searchKey);
			Thread.sleep(3000);
			String testValue = searchText.getAttribute("value");
			System.out.println(testValue +"::::"+searchKey);
			searchText.clear();
			//verify correct value in searchbox
			Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
	}
	}
	
	/**
	 * Here the DAtaProvider will provide Object array on the basis on ITestContext
	 * @param c
	 * @return
	 */
	@DataProvider(name="SearchProvider")
	public Object[][] getDataFromDataprovider(ITestContext c){
	Object[][] groupArray = null;
		for (String group : c.getIncludedGroups()) {
		if(group.equalsIgnoreCase("A")){
			groupArray = new Object[][] { 
					{ "Guru99", "India" }, 
					{ "Krishna", "UK" }, 
					{ "Bhupesh", "USA" } 
				};
		break;	
		}
			else if(group.equalsIgnoreCase("B"))
			{
			groupArray = new Object[][] { 
						{  "Canada" }, 
						{  "Russia" }, 
						{  "Japan" } 
					};
			}
		break;
	}
	return groupArray;		
	}
}

Notă: Dacă rulați direct clasa de testare, va apela mai întâi furnizorul de date care nu poate obține informații despre grupuri, deoarece grupurile nu sunt disponibile. Dar, în schimb, dacă apelați această clasă prin testng.xml, va avea informații despre grupuri disponibile cu ITestContext. Utilizați următorul XML pentru a apela testul

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter">

  <test name="example1">

    <groups>
        <run>
            <include name="A" />
        </run>
    </groups>

    <classes>
       <class
        name="parameters.ParameterByITestContextInDataprovider" />
    </classes>

  </test>


  <test name="example2">

    <groups>
        <run>
            <include name="B" />
        </run>
    </groups>

    <classes>
       <class
        name="parameters.ParameterByITestContextInDataprovider" />
    </classes>

  </test>

</suite>

Rezumat

  • Parametrizare este necesar pentru a crea Testare bazată pe date.
  • TestNG suportă două tipuri de parametrizare, folosind @Parametru+TestNG.xml și utilizarea@DataProvider
  • In @Parametru+TestNG.xml parametrii pot fi plasați la nivel de suită și la nivel de test. Dacă

    Același nume de parametru este declarat în ambele locuri; parametrul de nivel de testare va primi preferință față de parametrul de nivel de costum.

  • folosind @Parameter+TestNG.xml poate fi setată o singură valoare la un moment dat, dar @DataProvider revine o matrice 2d de Object.
  • Dacă DataProvider este prezent în altă clasă, atunci clasa în care se află metoda de testare,Furnizor de date ar trebui să fie metoda statică.
  • Există doi parametri acceptați de Furnizor de date sunt Metodă si ITestContext.