Dataleverandør og TestNG XML: Parametrisering i Selenium(Eksempel)
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
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
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
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)
Nå kan parametere defineres på 2 nivåer
- Suitenivå – Parametrene inne i tag av TestNG XML-filen vil være en parameter på suitenivå.
- 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å
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.
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
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.
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.
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.
Komplett eksempel
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.
Kodeeksempel
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.
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
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.
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.