Tietojen tarjoaja & TestNG XML: Parametrisointi sisään Selenium(Esimerkki)
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
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
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
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)
Nyt parametrit voidaan määrittää kahdella tasolla
- Suite taso – parametrit sisällä tunniste TestNG XML-tiedosto on sarjatason parametri.
- Test Level — parametrit sisällä Testattavan XML-tiedoston tunniste on testitason parametri.
Tässä on sama testi sviittitason parametreilla
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.
Ongelmien karttoittaminen
Numero 1 Testng.xml:n parametrin arvoa ei voida typecasta vastaavan testimenetelmän parametriin, se aiheuttaa virheen.
Harkitse seuraavaa esimerkkiä
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.
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.
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.
Täydellinen esimerkki
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ä.
Koodiesimerkki
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.
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
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.
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.