Dataleverandør og TestNG XML: Parametrisering i Selenium(Eksempel)

Når vi lager programvare, ønsker vi alltid at den skal fungere annerledes med et annet sett med data. Når det gjelder Testing den samme programvaren, vi kan ikke være urettferdige å teste den med bare ett sett med data. Her må vi igjen bekrefte at systemet vårt tar alle sett med kombinasjoner som forventes å støtte. For det må vi parametrisere testskjemaene våre. Her kommer Parametrisering i bildet.

Parametrisering i Selenium

Parametrisering i Selenium er en prosess for å parameterisere testskriptene for å sende flere data til applikasjonen under kjøring. Det er en utførelsesstrategi som automatisk kjører testtilfeller flere ganger med forskjellige verdier. Konseptet oppnådd ved å parameterisere testskriptene kalles Datadrevet testing.

Type parameterisering i TestNG-

For å gjøre parameterisering mer oversiktlig, vil vi gå gjennom parameteriseringsalternativene i et av de mest populære rammeverket for Selenium Webdriver – TestNG.

Det finnes to måter som vi kan oppnå parameterisering i TestNG

  1. Med hjelp av Parametre merknad og TestNG XML filen.

    Type parameterisering i TestNG

  2. Med hjelp av Dataleverandør merknad.

    Type parameterisering i TestNG

Type parameterisering i TestNG

Parametere fra Testng.xml kan være suite- eller testnivå

Parameter fra DataProvider kan ta Method og ITestContext som parameter.

La oss studere dem i detalj -

Parametere Annotering i TestNG

Parametere Annotering i TestNG er en metode som brukes til å sende verdier til testmetodene som argumenter ved å bruke .xml-fil. Brukere kan bli pålagt å sende verdiene til testmetodene under kjøretiden. @Parameters-kommentarmetoden kan brukes i alle metoder som har @Test, @Before, @After eller @Factory-kommentarer.

Parameterkommentar med Testng.xml

Velg parameterisering ved hjelp av merknader når du ønsker å håndtere kompleksitet og antall inngangskombinasjoner er mindre.

La se hvordan dette fungerer

Testscenario

Trinn 1) Start nettleseren og gå til Google.com

Trinn 2) Skriv inn et søkeord

Parametere Annotering Med Testng.Xml

Trinn 3) Kontroller at den angitte verdien er den samme som den som er gitt av testdataene våre

Trinn 4) Gjenta 2 og 3 til alle verdiene er lagt inn

Testforfatter Søkenøkkel
Guru99 India
Krishna Norge
Bhupesh Kina

Her er et eksempel på hvordan du gjør det UTEN parametere

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));
}
}

En studie, eksemplet ovenfor. Tenk deg hvor kompleks koden vil bli når vi gjør dette for 3 inngangskombinasjoner

La oss nå parametrisere dette ved å bruke TestNG

For å gjøre det, må du

  • Lag en XML-fil som lagrer parameterne
  • I testen legger du til kommentar @Parameters

Parametere Annotering Med Testng.Xml

Her er den komplette koden

Testnivå 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>

ParameterWithTestNGXML.java-fil

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));

}
}

Instruksjoner for å kjøre skriptet, velg XML-filen og Kjør som Test NG Suite

Høyreklikk på .xml-fil -> Kjør som -> Testng Suite (Merk: Suite)

ParameterWithTestNGXML.java-fil

Nå kan parametere defineres på 2 nivåer

  1. Suitenivå – Parametrene inne i tag av TestNG XML-filen vil være en parameter på suitenivå.
  2. Testnivå — Parametrene inne i kode for testing av XML-filen vil være en parameter på testnivå.

Her er den samme testen med parametere på suitenivå

ParameterWithTestNGXML.java-fil

NOTAT: Hvis parameternavnet er det samme på suitenivå og testnivå, vil testnivåparameteren bli foretrukket fremfor suitenivå. Så i så fall vil alle klassene innenfor det testnivået dele den overstyrte parameteren, og andre klasser som er utenfor testnivået vil dele suitenivåparameteren.

ParameterWithTestNGXML.java-fil

Feilsøking

Utgave # 1 Parameterverdien i testng.xml kan ikke typecastes til den tilsvarende testmetodens parameter det vil gi en feil.

Tenk på følgende eksempel

Feilsøking

Her er 'author'-attributt lik 'Guru99' som er en streng og i tilsvarende testmetode forventer den en heltallsverdi, så vi får et unntak her.

Utgave # 2 @Parameterne dine har ikke en tilsvarende verdi i testing.xml.

Du kan løse denne situasjonen ved å legge til @valgfri merknad i den tilsvarende parameteren i testmetoden.

Feilsøking

Utgave nr. 3: Du vil teste flere verdier av samme parameter ved å bruke Testng.xml

Det enkle svaret er at dette ikke kan gjøres! Du kan ha flere forskjellige parametere, men hver parameter kan bare ha en enkelt verdi. Dette bidrar til å forhindre hardkoding av verdier i skriptet. Dette gjør koden gjenbrukbar. Tenk på det som konfigurasjonsfiler for skriptet ditt. Hvis du vil bruke flere verdier for en parameter, bruk DataProviders

Dataleverandør i TestNG

Dataleverandør i TestNG er en metode som brukes når en bruker trenger å sende komplekse parametere. Komplekse parametere må opprettes fra Java som komplekse objekter, objekter fra egenskapsfiler eller fra en database kan sendes av dataleverandørmetoden. Metoden er kommentert av @DataProvider og den returnerer en rekke objekter.

Parametere ved hjelp av Dataprovider

@Parameters-annotering er enkelt, men for å teste med flere sett med data må vi bruke Data Provider.

For å fylle ut tusenvis av nettskjemaer ved å bruke vårt testrammeverk trenger vi en annen metodikk som kan gi oss et veldig stort datasett i en enkelt utførelsesflyt.

Dette datadrevne konseptet oppnås ved @Dataleverandør merknad i TestNG.

Parametere ved hjelp av dataleverandør

Den har bare én attributt 'navn'. Hvis du ikke spesifiserer navneattributtet, vil dataleverandørens navn være det samme som det tilsvarende metodenavnet.

Dataleverandøren returnerer et todimensjonalt JAVA-objekt til testmetoden og testmetoden, vil påkalle M ganger i en M*N type objektmatrise. For eksempel, hvis DataProvider returnerer en matrise med 2*3 objekter, vil den tilsvarende testsaken bli påkalt 2 ganger med 3 parametere hver gang.

Parametere ved hjelp av dataleverandør

Komplett eksempel

Parametere ved hjelp av dataleverandør

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" }
        };

    }

}

Påkall DataProvider fra en annen klasse

Som standard ligger DataProvider i samme klasse der testmetoden er eller dens basisklasse. For å sette den i en annen klasse må vi gjøre dataleverandørmetoden til statisk og i testmetoden må vi legge til et attributt dataProviderClass in @Test merknad.

Påkalle DataProvider fra en annen klasse

Kodeeksempel

Påkalle DataProvider fra en annen klasse

TestClass ParameterDataleverandørWithClassLevel.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" }
            };  
}}

Typer parametere i dataleverandør

Det er to typer parametere som støttes av DataProvider-metoden.

Metode- Hvis den SAMME DataProvider bør oppføre seg annerledes med forskjellige testmetoder, bruk metodeparameter.

Typer av parametere i dataleverandør

I følgende eksempel

  • Vi sjekker om metodenavnet er testMethodA.
  • Hvis ja, returner ett sett med verdi
  • Ellers returnerer du et annet sett med verdi
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" }
            };}       
    }
}

Her er utgangen

Typer av parametere i dataleverandør

ITestContext– Den kan brukes til å lage forskjellige parametere for testtilfeller basert på grupper.

I det virkelige liv kan du bruke ITestContext til å variere parameterverdier basert på testmetoder, verter og konfigurasjoner av testen.

Typer av parametere i dataleverandør

I følgende kodeeksempel

  • Vi har 2 grupper A og B
  • Hver testmetode er tildelt en gruppe
  • Hvis verdien av gruppen er A, returneres et bestemt datasett
  • Hvis verdien av gruppen er B, returneres et annet datasett
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;		
	}
}

Merk: Hvis du kjører testklassen din direkte, vil den først ringe dataleverandøren som ikke kan få gruppeinformasjon da grupper ikke er tilgjengelige. Men i stedet hvis du kaller denne klassen via testng.xml, vil den ha gruppeinformasjon tilgjengelig med ITestContext. Bruk følgende XML for å kalle testen

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

Sammendrag

  • Parametrisering er nødvendig for å lage Datadrevet testing.
  • TestNG støtte to typer parameterisering, ved hjelp av @Parameter+TestNG. Xml og bruke@Dataleverandør
  • In @Parameter+TestNG. Xml parametere kan plasseres på suitenivå og testnivå. Hvis

    Det samme parameternavnet er deklarert begge steder; testnivåparameter vil få preferanse fremfor fargenivåparameter.

  • ved å bruke @Parameter+TestNG.xml kan bare angis én verdi om gangen, men @DataProvider returnerer en 2d-array av objekter.
  • Hvis DataProvider er til stede i den andre klassen, er klassen der testmetoden ligger,Dataleverandør bør være statisk metode.
  • Det er to parametere som støttes av Dataleverandør er Metode og ITestContext.