Davatelj podataka & TestNG XML: Parametrizacija u Selenium(Primjer)

Dok stvaramo softver, uvijek želimo da radi drugačije s drugačijim skupom podataka. Kada je u pitanju Ispitivanje isti softver, ne možemo biti nepravedni testirati ga samo s jednim skupom podataka. Ovdje opet moramo provjeriti uzima li naš sustav sve skupove kombinacija za koje se očekuje da će ih podržavati. Za to moramo parametrizirati naše testne skripte. Ovdje dolazi parametrizacija na slici.

Parametriranje u Selenium

Parametriranje u Selenium je proces za parametrizaciju testnih skripti kako bi se proslijedilo više podataka aplikaciji tijekom izvođenja. To je strategija izvršenja koja automatski pokreće testne slučajeve više puta koristeći različite vrijednosti. Koncept postignut parametrizacijom testnih skripti naziva se Testiranje temeljeno na podacima.

Vrsta parametrizacije u TestNG-

Da bi parametrizacija bila jasnija, proći ćemo kroz opcije parametrizacije u jednom od najpopularnijih okvira za Selenium Webdriver – TestNG.

Postoje dva puta kojim možemo postići parametrizaciju u TestNG

  1. Uz pomoć Parametri pribilješka i TestNG XML file.

    Vrsta parametrizacije u TestNG

  2. Uz pomoć DataProvider komentarima.

    Vrsta parametrizacije u TestNG

Vrsta parametrizacije u TestNG

Parametri iz Testng.xml mogu biti na razini paketa ili testa

Parametar iz DataProvidera može uzeti Method i ITestContext kao parametar.

Proučimo ih detaljno –

Parametri Anotacija u TestNG

Parametri Anotacija u TestNG je metoda koja se koristi za prosljeđivanje vrijednosti testnim metodama kao argumenata pomoću .xml datoteke. Korisnici će možda morati proslijediti vrijednosti testnim metodama tijekom vremena izvođenja. Metoda oznake @Parameters može se koristiti u bilo kojoj metodi koja ima oznaku @Test, @Before, @After ili @Factory.

Bilješka parametara s Testng.xml

Odaberite parametrizaciju pomoću napomena kada se želite baviti složenošću i manji je broj ulaznih kombinacija.

Da vidimo kako ovo radi

Testni scenarij

Korak 1) Pokrenite preglednik i idite na Google.com

Korak 2) Unesite ključnu riječ za pretraživanje

Napomena parametara s Testng.Xml

Korak 3) Provjerite je li unesena vrijednost ista kao ona koju daju naši testni podaci

Korak 4) Ponavljajte korake 2 i 3 dok ne unesete sve vrijednosti

Autor testa SearchKey
Guru99 Indija
Krishna SAD
Bhupesh Kina

Evo primjera kako to učiniti BEZ parametara

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

Studija, gornji primjer. Zamislite samo koliko će kod biti složen kada to učinimo za 3 ulazne kombinacije

Parametrizirajmo ovo pomoću TestNG

Da biste to učinili, morat ćete

  • Napravite XML datoteku koja će pohraniti parametre
  • U testu dodajte napomenu @Parametri

Napomena parametara s Testng.Xml

Ovdje je kompletan kod

Razina testa 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>

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

}
}

Upute za pokretanje skripte, odaberite XML datoteku i Pokreni kao Test NG Suite

Desni klik na .xml datoteku -> Pokreni kao -> Testng Apartman (Napomena: apartman)

ParametarWithTestNGDatoteka XML.java

Sada se parametri mogu definirati na 2 razine

  1. Suite level – Parametri unutar oznaka od TestNG XML datoteka bit će parametar na razini paketa.
  2. Testna razina — Parametri unutar oznaka testne XML datoteke bit će parametar Test razine.

Ovdje je isti test s parametrima razine paketa

ParametarWithTestNGDatoteka XML.java

NAPOMENA: U slučaju da je naziv parametra isti na razini paketa i testnoj razini, tada će parametar testne razine imati prednost u odnosu na razinu paketa. Dakle, u tom će slučaju sve klase unutar te razine testiranja dijeliti nadjačani parametar, a ostale klase koje su izvan razine testiranja dijelit će parametar razine paketa.

ParametarWithTestNGDatoteka XML.java

Rješavanje problema

Izdanje # 1 Vrijednost parametra u testng.xml ne može se pretvoriti u odgovarajući parametar testne metode, to će izbaciti pogrešku.

Razmotrite sljedeći primjer

Rješavanje problema

Ovdje je atribut 'autor' jednak 'Guru99' koji je niz iu odgovarajućoj testnoj metodi očekuje cjelobrojnu vrijednost, tako da ćemo ovdje dobiti iznimku.

Izdanje # 2 Vaši @Parametri nemaju odgovarajuću vrijednost u testing.xml.

Ovu situaciju možete riješiti dodavanjem @neobavezno pribilješka u odgovarajućem parametru u metodi ispitivanja.

Rješavanje problema

Izdanje # 3: Želite testirati više vrijednosti istog parametra pomoću Testng.xml

Jednostavan odgovor je da se to ne može učiniti! Možete imati više različitih parametara, ali svaki parametar može imati samo jednu vrijednost. To pomaže u sprječavanju tvrdog kodiranja vrijednosti u skriptu. Ovo čini kôd višekratno upotrebljivim. Zamislite to kao konfiguracijske datoteke za svoju skriptu. Ako želite koristiti više vrijednosti za parametar koristite DataProviders

Davatelj podataka u TestNG

Davatelj podataka u TestNG je metoda koja se koristi kada korisnik treba proslijediti složene parametre. Potrebno je izraditi složene parametre Java kao što su složeni objekti, objekti iz datoteka svojstava ili iz baze podataka mogu se proslijediti metodom pružatelja podataka. Metoda je označena @DataProviderom i vraća niz objekata.

Parametri koji koriste Dataprovider

Bilješka @Parameters je jednostavna, ali za testiranje s višestrukim skupovima podataka trebamo koristiti Data Provider.

Za ispunjavanje tisuća web obrazaca pomoću našeg okvira za testiranje potrebna nam je drugačija metodologija koja nam može dati vrlo velik skup podataka u jednom tijeku izvršenja.

Ovaj koncept vođen podacima postiže se putem @DataProvider anotacija u TestNG.

Parametri koji koriste Dataprovider

Ima samo jedan atribut 'ime'. Ako ne navedete atribut imena, tada će ime davatelja podataka biti isto kao i naziv odgovarajuće metode.

Pružatelj podataka vraća dvodimenzionalni JAVA objekt na test metodu i test metodu, pozvati će M puta u M*N tipu niza objekata. Na primjer, ako DataProvider vrati niz od 2*3 objekta, odgovarajući testni slučaj će se pozvati 2 puta sa 3 parametra svaki put.

Parametri koji koriste Dataprovider

Kompletan primjer

Parametri koji koriste 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" }
        };

    }

}

Pozvati DataProvider iz druge klase

Prema zadanim postavkama, DataProvider se nalazi u istoj klasi u kojoj je testna metoda ili njezinoj osnovnoj klasi. Da bismo ga stavili u neku drugu klasu, moramo načiniti metodu pružatelja podataka statičnom, a u testnoj metodi moramo dodati atribut DataProviderClass in @Test komentarima.

Pozovi DataProvider iz druge klase

Primjer koda

Pozovi DataProvider iz druge klase

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

Vrste parametara u Dataprovideru

Postoje dvije vrste parametara koje podržava DataProvider metoda.

način- Ako je ISTI DataProvider bi se trebao ponašati drugačije s drugom metodom ispitivanja, upotrijebite parametar metode.

Vrste parametara u Dataprovideru

U sljedećem primjeru,

  • Provjeravamo je li naziv metode testMethodA.
  • Ako da, vratite jedan skup vrijednosti
  • Inače vraća drugi skup vrijednosti
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" }
            };}       
    }
}

Evo izlaza

Vrste parametara u Dataprovideru

ITestContext– Može se koristiti za stvaranje različitih parametara za testne slučajeve na temelju grupa.

U stvarnom životu možete koristiti ITestContext za mijenjanje vrijednosti parametara na temelju testnih metoda, hostova, konfiguracija testa.

Vrste parametara u Dataprovideru

U sljedećem primjeru koda

  • Imamo 2 grupe A i B
  • Svaka metoda ispitivanja dodijeljena je skupini
  • Ako je vrijednost grupe A, vraća se određeni skup podataka
  • Ako je vrijednost grupe B, vraća se drugi skup podataka
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;		
	}
}

Napomena: Ako izravno pokrenete svoju testng klasu, ona će prvo pozvati dataprovidera koji ne može dobiti informacije o grupama jer grupe nisu dostupne. Ali umjesto toga, ako pozovete ovu klasu putem testng.xml, ona će imati informacije o grupama dostupne s ITestContext. Koristite sljedeći XML za pozivanje testa

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

rezime

  • Parametriranje potrebno je stvoriti Testiranje temeljeno na podacima.
  • TestNG podržavaju dvije vrste parametrizacije, koristeći @Parametar+TestNG. XML i korištenjem@DataProvider
  • In @Parametar+TestNG. XML parametri se mogu postaviti na razinu paketa i razinu testiranja. Ako

    Isti naziv parametra je deklariran na oba mjesta; parametar razine testa imat će prednost nad parametrom razine odijela.

  • koristeći @Parametar+TestNG.xml može se postaviti samo jedna vrijednost odjednom, ali @DataProvider vraća 2d niz Objekta.
  • Ako je DataProvider prisutan u drugoj klasi, onda u klasi u kojoj se nalazi test metoda,DataProvider bi trebao biti statička metoda.
  • Postoje dva parametra koja podržava DataProvider ima način i ITestContext.