Davatelj podataka & TestNG XML: Parametrizacija u Selenium(Primjer)
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
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
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
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)
Sada se parametri mogu definirati na 2 razine
- Suite level – Parametri unutar oznaka od TestNG XML datoteka bit će parametar na razini paketa.
- Testna razina — Parametri unutar oznaka testne XML datoteke bit će parametar Test razine.
Ovdje je isti test s parametrima razine paketa
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.
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
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.
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.
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.
Kompletan primjer
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.
Primjer koda
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.
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
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.
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.