Tietojen tarjoaja & TestNG XML: Parametrisointi sisään Selenium(Esimerkki)

Kun luomme ohjelmistoja, toivomme aina, että se toimisi eri tavalla eri tietojoukon kanssa. Kun on kyse Testaus samaa ohjelmistoa, emme voi olla epäreilua testata sitä vain yhdellä tietojoukolla. Tässäkin meidän on varmistettava, että järjestelmämme ottaa kaikki yhdistelmät, joiden odotetaan tukevan. Tätä varten meidän on parametroitava testiscipts. Tässä tulee parametrointi kuvassa.

Parametrisointi sisään Selenium

Parametrisointi sisään Selenium on prosessi testiskriptien parametroimiseksi useiden tietojen välittämiseksi sovellukselle suorituksen aikana. Se on suoritusstrategia, joka suorittaa testitapaukset automaattisesti useita kertoja eri arvoilla. Konseptia, joka saavutetaan parametroimalla testiskriptit, kutsutaan Tietoihin perustuva testaus.

Parametrisoinnin tyyppi sisään TestNG-

Parametrisoinnin selkeyttämiseksi käymme läpi parametrointivaihtoehdot yhdessä suosituimmasta kehyksestä Selenium Webdriver - TestNG.

On kaksi tapaa jolla voimme saavuttaa parametroinnin TestNG

  1. Avulla parametrit huomautus ja TestNG XML tiedosto.

    Parametrisoinnin tyyppi sisään TestNG

  2. Avulla DataProvider merkintä.

    Parametrisoinnin tyyppi sisään TestNG

Parametrisoinnin tyyppi sisään TestNG

Testng.xml:n parametrit voivat olla sarja- tai testitasoisia

DataProviderin parametri voi ottaa Methodin ja ITestContextin parametreina.

Tutkitaan niitä yksityiskohtaisesti -

Parametrit Annotaatio sisään TestNG

Parametrit Annotaatio sisään TestNG on menetelmä, jota käytetään arvojen välittämiseen testimenetelmille argumentteina .xml-tiedoston avulla. Käyttäjiä voidaan vaatia välittämään arvot testimenetelmille ajon aikana. @Parameters-merkintämenetelmää voidaan käyttää missä tahansa menetelmässä, jossa on @Test-, @Before-, @After- tai @Factory-merkintä.

Parametrien huomautus Testng.xml:llä

Valitse parametrointi merkintöjen avulla, kun haluat käsitellä monimutkaisuutta ja syöttöyhdistelmien lukumäärä on pienempi.

Katsotaan kuinka tämä toimii

Testiskenaario

Vaihe 1) Käynnistä selain ja siirry osoitteeseen Google.com

Vaihe 2) Kirjoita hakusana

Parametrien huomautus Testng.Xml:llä

Vaihe 3) Varmista, että syötetty arvo on sama kuin testitiedoissamme

Vaihe 4) Toista 2 ja 3, kunnes kaikki arvot on syötetty

Testin kirjoittaja Hakuavain
Guru99 Intia
Krishna Soumi
Bhupesh Kiina

Tässä on esimerkki siitä, kuinka se tehdään ILMAN parametreja

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

Tutkimus, yllä oleva esimerkki. Kuvittele kuinka monimutkainen koodi tulee, kun teemme tämän 3 syöttöyhdistelmälle

Nyt parametroidaan tämä käyttämällä TestNG

Sinun tulee tehdä niin

  • Luo XML-tiedosto, joka tallentaa parametrit
  • Lisää testissä huomautus @Parameters

Parametrien huomautus Testng.Xml:llä

Tässä on täydellinen koodi

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

Parametri WithTestNGXML.java tiedosto

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

}
}

Ohjeet komentosarjan suorittamiseen, valitse XML-tiedosto ja Suorita Test NG Suitena

Napsauta hiiren kakkospainikkeella .xml-tiedostoa -> Suorita nimellä -> Testng Sviitti (Huom: Sviitti)

Parametri WithTestNGXML.java tiedosto

Nyt parametrit voidaan määrittää kahdella tasolla

  1. Suite taso – parametrit sisällä tunniste TestNG XML-tiedosto on sarjatason parametri.
  2. Test Level — parametrit sisällä Testattavan XML-tiedoston tunniste on testitason parametri.

Tässä on sama testi sviittitason parametreilla

Parametri WithTestNGXML.java tiedosto

HUOMAUTUS: Jos parametrin nimi on sama sarjatasolla ja testitasolla, testitason parametri saa etusijalle sarjatason. Joten siinä tapauksessa kaikki testitason sisällä olevat luokat jakavat ohitetun parametrin, ja muut testitason ulkopuolella olevat luokat jakavat sarjatason parametrin.

Parametri WithTestNGXML.java tiedosto

Ongelmien karttoittaminen

Numero 1 Testng.xml:n parametrin arvoa ei voida typecasta vastaavan testimenetelmän parametriin, se aiheuttaa virheen.

Harkitse seuraavaa esimerkkiä

Ongelmien karttoittaminen

Tässä 'author'-attribuutti on yhtä kuin 'Guru99', joka on merkkijono ja vastaavassa testimenetelmässä se odottaa kokonaislukuarvoa, joten saamme tästä poikkeuksen.

Numero 2 @Parameters-parametreillasi ei ole vastaavaa arvoa testing.xml:ssä.

Voit ratkaista tämän tilanteen lisäämällä @valinnainen huomautus vastaavassa testimenetelmän parametrissa.

Ongelmien karttoittaminen

Ongelma 3: Haluat testata useita saman parametrin arvoja Testng.xml:n avulla

Yksinkertainen vastaus on, että tätä ei voi tehdä! Sinulla voi olla useita eri parametreja, mutta kullakin parametrilla voi olla vain yksi arvo. Tämä auttaa estämään kovakoodausarvoja skriptiin. Tämä tekee koodista uudelleenkäytettävän. Ajattele sitä komentosarjasi asetustiedostoina. Jos haluat käyttää useita arvoja parametrille, käytä DataProviders-ohjelmaa

Tietojen toimittaja sisään TestNG

Tietojen toimittaja sisään TestNG on menetelmä, jota käytetään, kun käyttäjän on välitettävä monimutkaisia ​​parametreja. Monimutkaiset parametrit on luotava Java kuten monimutkaiset objektit, objektit ominaisuustiedostoista tai tietokannasta voidaan välittää tiedontarjoajan menetelmällä. @DataProvider merkitsee menetelmän ja se palauttaa joukon objekteja.

Parametrit Dataproviderilla

@Parameters-merkintä on helppoa, mutta testataksemme useilla tietosarjoilla meidän on käytettävä Data Provider -ohjelmaa.

Jotta voimme täyttää tuhansia verkkolomakkeita testauskehyksemme avulla, tarvitsemme erilaisen menetelmän, joka voi antaa meille erittäin suuren tietojoukon yhdessä suoritusvirtauksessa.

Tämä datalähtöinen konsepti saavutetaan @DataProvider huomautus sisään TestNG.

Dataprovider-parametrit

Siinä on vain yksi ominaisuuden nimi'. Jos et määritä name-attribuuttia, DataProviderin nimi on sama kuin vastaavan menetelmän nimi.

Tietojen toimittaja palauttaa kaksiulotteinen JAVA-objekti testimenetelmään ja testimenetelmään, kutsuu M kertaa M*N-tyyppisessä objektitaulukossa. Jos DataProvider esimerkiksi palauttaa 2*3 objektin taulukon, vastaava testitapaus kutsutaan 2 kertaa 3 parametrilla joka kerta.

Dataprovider-parametrit

Täydellinen esimerkki

Dataprovider-parametrit

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

    }

}

Kutsu DataProvider eri luokasta

Oletusarvoisesti DataProvider sijaitsee samassa luokassa, jossa testimenetelmä on tai sen perusluokka. Jos haluat laittaa sen johonkin toiseen luokkaan, meidän on tehtävä tiedontarjoajan menetelmä staattiseksi ja testimenetelmässä on lisättävä attribuutti dataProviderClass in @Testata merkintä.

Kutsu DataProvider eri luokasta

Koodiesimerkki

Kutsu DataProvider eri luokasta

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

Dataproviderin parametrityypit

DataProvider-menetelmä tukee kahdenlaisia ​​parametreja.

Menetelmä- Jos SAMA DataProviderin tulee käyttäytyä eri tavalla eri testimenetelmillä, käytä Method-parametria.

Dataproviderin parametrityypit

Seuraavassa esimerkissä

  • Tarkistamme, onko menetelmän nimi testMethodA.
  • Jos kyllä, palauta yksi arvojoukko
  • Muussa tapauksessa palauttaa toisen arvojoukon
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" }
            };}       
    }
}

Tässä on tulos

Dataproviderin parametrityypit

ITestContext– Sitä voidaan käyttää erilaisten parametrien luomiseen testitapauksille ryhmien perusteella.

Tosielämässä voit käyttää ITestContextia parametrien arvojen muuttamiseksi testimenetelmien, isäntien ja testin kokoonpanojen perusteella.

Dataproviderin parametrityypit

Seuraavassa koodiesimerkissä

  • Meillä on 2 ryhmää A ja B
  • Jokainen testimenetelmä on määritetty ryhmään
  • Jos ryhmän arvo on A, palautetaan tietty tietojoukko
  • Jos ryhmän arvo on B, palautetaan toinen tietojoukko
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;		
	}
}

Huomautus: Jos suoritat testausluokkaasi suoraan, se soittaa ensin datatoimittajalle, joka ei voi saada ryhmätietoja, koska ryhmät eivät ole käytettävissä. Mutta sen sijaan jos kutsut tätä luokkaa testng.xml:n kautta, siinä on ryhmätiedot saatavilla ITestContextin avulla. Käytä seuraavaa XML-koodia testin kutsumiseen

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

Yhteenveto

  • Parametrisointi on luotava Tietoihin perustuva testaus.
  • TestNG tukee kahdenlaista parametrointia käyttämällä @Parametri+TestNG. Xml ja käyttää@DataProvider
  • In @Parametri+TestNG. Xml parametrit voidaan sijoittaa sarjatasolle ja testitasolle. Jos

    Sama parametrin nimi ilmoitetaan molemmissa paikoissa; testitason parametri saa etusija pukutason parametriin nähden.

  • käyttämällä @Parameter+TestNG.xml vain yksi arvo voidaan asettaa kerrallaan, mutta @DataProvider palauttaa 2d-objektien joukko.
  • Jos DataProvider on eri luokassa, luokka, jossa testimenetelmä sijaitsee,DataProvider tulisi olla staattinen menetelmä.
  • Tukee kahta parametria DataProvider olemme Menetelmä ja ITestContext.