Dataprovider & TestNG XML: Parameterisering i selen (exempel)

Innehållsförteckning:

Anonim

När vi skapar programvara önskar vi alltid att det ska fungera annorlunda med en annan uppsättning data. När det gäller att testa samma programvara kan vi inte vara orättvist att testa den med bara en uppsättning data. Här måste vi verifiera att vårt system tar alla de kombinationer som förväntas stödja. För det måste vi parametrisera våra testskript. Här kommer parametreringen på bilden.

Parameterisering i selen

Parameterisering i Selen är en process för att parametrisera testskript för att skicka flera data till applikationen vid körning. Det är en körningsstrategi som automatiskt kör testfall flera gånger med olika värden. Konceptet som uppnås genom att parametrar testskripten kallas Data Driven Testing .

I den här handledningen lär du dig-

  • Typ av parametrisering i TestNG-
  • Anmärkning av parametrar med Testng.xml
  • Felsökning
  • Parametrar som använder Dataprovider
  • Anropa DataProvider från olika klasser
  • Typer av parametrar i Dataprovider

Typ av parametrisering i TestNG-

För att göra parametreringen tydligare kommer vi att gå igenom parametreringsalternativen i ett av de mest populära ramarna för Selen Webdriver - TestNG .

Det finns två sätt på vilka vi kan uppnå parametrar i TestNG

  1. Med hjälp av Parameters annotation och TestNG XML- fil.

  2. Med hjälp av DataProvider- kommentar.

Parametrar från Testng.xml kan vara svit eller testnivå

Parameter från DataProvider kan ta Method och ITestContext som parameter.

Låt oss studera dem i detalj -

Parameter Anmärkning i TestNG

Parameters Annotation i TestNG är en metod som används för att skicka värden till testmetoderna som argument med XML-filen. Användare kan behöva skicka värdena till testmetoderna under körtiden. Annoteringsmetoden @Parameters kan användas i vilken metod som helst med @Test, @Before, @After eller @Factory-kommentar.

Anmärkning av parametrar med Testng.xml

Välj parameterisering med hjälp av anteckningar när du vill hantera komplexitet och antalet ingångskombinationer är mindre.

Låt oss se hur detta fungerar

Testscenario

Steg 1) Starta webbläsaren och gå till Google.com

Steg 2) Ange ett sökord

Steg 3) Kontrollera att det inmatade värdet är detsamma som det som tillhandahålls av våra testdata

Steg 4) Upprepa 2 & 3 tills alla värden matas in

Testförfattare Sök nyckel
Guru99 Indien
Krishna USA
Bhupesh Kina

Här är ett exempel på hur man gör det UTAN parametrar

paketparametrar;importera org.testng.annotations.Test;importera org.testng.AssertJUnit;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;offentlig klass NoParameterWithTestNGXML {Sträng driverPath = "C: \\ geckodriver.exe";WebDriver-drivrutin;@Testapublic void testNoParameter () kastar InterruptedException {Strängförfattare = "guru99";String searchKey = "indien";System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Söker text i Googles textrutasearchText.sendKeys (searchKey);System.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);System.out.println ("Tråden kommer att sova nu");Tråd. Sömn (3000);System.out.println ("Värde i Googles sökruta =" + searchText.getAttribute ("värde") + "::: Värde ges av input =" + searchKey);// verifiera värdet i Googles sökrutaAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}

En studie, exemplet ovan. Tänk dig hur komplex koden blir när vi gör detta för 3 ingångskombinationer

Låt oss nu parametrisera detta med TestNG

För att göra det måste du

  • Skapa en XML-fil som lagrar parametrarna
  • Lägg till kommentar @Parameters i testet

Här är den fullständiga koden

Testnivå TestNG.xml




ParameterWithTestNGXML.java-fil

paketparametrar;importera org.testng.AssertJUnit;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.annotations.Optional;importera org.testng.annotations.Parameters;importera org.testng.annotations.Test;offentlig klass ParameterWithTestNGXML {Sträng driverPath = "C: \\ geckodriver.exe";WebDriver-drivrutin;@Testa@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Strängförfattare, String searchKey) kastar InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Söker text i Googles textrutasearchText.sendKeys (searchKey);System.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);System.out.println ("Tråden kommer att sova nu");Tråd. Sömn (3000);System.out.println ("Värde i Googles sökruta =" + searchText.getAttribute ("värde") + "::: Värde ges av input =" + searchKey);// verifiera värdet i Googles sökrutaAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}

Instruktioner för att köra skriptet, välj XML-filen och kör som test NG Suite

Högerklicka på .xml-filen -> Kör som -> Testng Suite (Obs: Suite)

Nu kan parametrar definieras på två nivåer

  1. Svitenivå - Parametrarna inuti -taggen för TestNG XML-filen kommer att vara en svitnivåparameter.
  2. Testnivå - Parametrarna i -taggen för att testa XML-filen kommer att vara en testnivåparameter.

Här är samma test med parametrar på svitenivå

OBS: Om parameternamnet är samma i svitenivå och testnivå kommer testnivåparametern att ha preferens framför svitenivå. Så i så fall delar alla klasser inom den testnivån den åsidosatta parametern, och andra klasser som ligger utanför testnivån kommer att dela parametern för svitenivå.

Felsökning

Utgåva # 1 Parametervärdet i testng.xml kan inte skrivas till motsvarande testmetods parameter, det kommer att orsaka ett fel.

Tänk på följande exempel

Här är attributet "author" lika med "Guru99", vilket är en sträng och i motsvarande testmetod förväntar det sig ett heltal, så vi får ett undantag här.

Utgåva 2 Dina @Parameters har inte motsvarande värde i testing.xml.

Du kan lösa den här situationen genom att lägga till @optional annotation i motsvarande parameter i testmetoden.

Utgåva 3: Du vill testa flera värden av samma parameter med Testng.xml

Det enkla svaret är att detta inte kan göras! Du kan ha flera olika parametrar, men varje parameter kan bara ha ett enda värde. Detta hjälper till att förhindra hårdkodningsvärden i skriptet. Detta gör att koden kan återanvändas. Tänk på det som konfigurationsfiler för ditt skript. Om du vill använda flera värden för en parameter, använd DataProviders

Dataleverantör i TestNG

Dataleverantör i TestNG är en metod som används när en användare behöver skicka komplexa parametrar. Komplexa parametrar måste skapas från Java, till exempel komplexa objekt, objekt från fastighetsfiler eller från en databas kan skickas med dataleverantörsmetoden. Metoden antecknas av @ DataProvider och den returnerar en uppsättning objekt.

Parametrar som använder Dataprovider

Kommentarer från @Parameters är enkla men att testa med flera datauppsättningar vi behöver för att använda Data Provider.

För att fylla tusentals webbformulär med vårt testramverk behöver vi en annan metod som kan ge oss en mycket stor dataset i ett enda körningsflöde.

Detta datadrivna koncept uppnås med @DataProvider- kommentar i TestNG.

Den har bara ett attribut 'namn' . Om du inte anger namnattributet kommer DataProvider-namnet att vara detsamma som motsvarande metodnamn.

Dataleverantören returnerar ett tvådimensionellt JAVA-objekt till testmetoden och testmetoden, anropar M gånger i en M * N-typ av objektmatris. Till exempel, om DataProvider returnerar en matris med 2 * 3 objekt, kommer motsvarande testcase att anropas två gånger med 3 parametrar varje gång.

Komplett exempel

paketparametrar;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.DataProvider;importera org.testng.annotations.Test;offentlig klass ParameterByDataprovider {WebDriver-drivrutin;Sträng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsinställning () {// Skapa firefox-drivarobjektSystem.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Testfall för att verifiera Googles sökruta* @param författare* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "Sökleverantör")public void testMethod (String author, String searchKey) kastar InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// sökvärde i google sökrutasearchText.sendKeys (searchKey);System.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);Sträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Kontrollera om värdet i Googles sökruta är korrektAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] där första kolumnen innehåller "författare"* och andra kolumnen innehåller 'searchKey'* /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider () {returnera nytt objekt [] []{{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Anropa DataProvider från olika klasser

Som standard finns DataProvider i samma klass där testmetoden är eller dess basklass. För att sätta det i någon annan klass måste vi göra dataleverantörsmetoden som statisk och i testmetoden måste vi lägga till ett attribut dataProviderClass i @Test- kommentar.

Kodexempel

TestClass ParameterDataproviderWithClassLevel.java

paketparametrar;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.Test;public class ParameterDataproviderWithClassLevel {WebDriver-drivrutin;Sträng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsinställning () {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny 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) kastar InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Sök text i Googles textrutasearchText.sendKeys (searchKey);System.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);// få text från sökrutanSträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifiera om sökrutan har rätt värdeAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

paketparametrar;importera org.testng.annotations.DataProvider;offentlig klass DataproviderClass {@DataProvider (name = "SearchProvider")offentligt statiskt objekt [] [] getDataFromDataprovider () {returnera nytt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Typer av parametrar i Dataprovider

Det finns två typer av parametrar som stöds av DataProvider-metoden.

Metod - Om SAME DataProvider skulle uppträda annorlunda med olika testmetoder, använd metodparameter.

I följande exempel,

  • Vi kontrollerar om metodnamnet är testMethodA.
  • Om ja, returnera en uppsättning värde
  • Annars returnerar du en annan uppsättning värde
paketparametrar;importera java.lang.reflect.Method;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.DataProvider;importera org.testng.annotations.Test;offentlig klass ParameterByMethodInDataprovider {WebDriver-drivrutin;Sträng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsinställning () {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "Sökleverantör")public void testMethodA (String author, String searchKey) kastar InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Sök text i sökrutansearchText.sendKeys (searchKey);// Skriv ut författare och söksträngSystem.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);Sträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifiera om Googles textruta visar korrekt värdeAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "Sökleverantör")public void testMethodB (String searchKey) kastar InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Sök text i sökrutansearchText.sendKeys (searchKey);// Skriv endast söksträngSystem.out.println ("Välkommen -> Okänd användare Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);Sträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifiera om Googles textruta visar korrekt värdeAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Här returnerar DataProvider värde på grundval av testmetodens namn* @param m* @lämna tillbaka** /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider (Metod m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {returnera nytt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}annan{returnera nytt objekt [] [] {{"Kanada"},{"Ryssland"},{"Japan"}};}}}

Här är resultatet

ITestContext - Det kan användas för att skapa olika parametrar för testfall baserat på grupper.

I verkligheten kan du använda ITestContext för att variera parametervärden baserat på testmetoder, värdar, konfigurationer av testet.

I följande kodexempel

  • Vi har två grupper A & B
  • Varje testmetod tilldelas en grupp
  • Om gruppens värde är A returneras en viss datamängd
  • Om värdet för gruppen är B returneras en annan datamängd
paketparametrar;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.ITestContext;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.DataProvider;importera org.testng.annotations.Test;public class ParameterByITestContextInDataprovider {WebDriver-drivrutin;Sträng driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupper = {"A", "B"})offentlig tomrumsinställning () {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "Sökleverantör", grupper = "A")public void testMethodA (String author, String searchKey) kastar InterruptedException {{// sök google textrutanWebElement searchText = driver.findElement (By.name ("q"));// söka efter ett värde på detsearchText.sendKeys (searchKey);System.out.println ("Välkommen ->" + författare + "Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);Sträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifiera rätt värde i sökrutanAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "Sökleverantör", grupper = "B")public void testMethodB (String searchKey) kastar InterruptedException {{// hitta googles sökrutaWebElement searchText = driver.findElement (By.name ("q"));// söka efter ett värde på detsearchText.sendKeys (searchKey);System.out.println ("Välkommen -> Okänd användare Din söknyckel är ->" + searchKey);Tråd. Sömn (3000);Sträng testValue = searchText.getAttribute ("värde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifiera rätt värde i sökrutanAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Här kommer DAtaProvider att tillhandahålla Object array på grundval av ITestContext* @param c* @lämna tillbaka* /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;för (Stränggrupp: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nytt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};ha sönder;}annars om (group.equalsIgnoreCase ("B")){groupArray = nytt objekt [] [] {{"Kanada"},{"Ryssland"},{"Japan"}};}ha sönder;}returgruppArray;}}

Obs! Om du kör din testng-klass direkt ringer den först dataprovider som inte kan få gruppinformation eftersom grupper inte är tillgängliga. Men istället om du ringer den här klassen via testng.xml, kommer den att ha gruppinformation tillgänglig med ITestContext. Använd följande XML för att ringa testet

Sammanfattning :

  • Parametrering krävs för att skapa datadriven testning .
  • TestNG stöder två typer av parametrar, med @ Parameter + TestNG.xml och med @DataProvider
  • I @ Parameter + TestNG.xml kan parametrar placeras på svitenivå och testnivå. Om

    Samma parameternamn deklareras på båda platserna; testnivåparametern får preferens framför kostymnivåparametern.

  • med hjälp av @ Parameter + TestNG.xml kan bara ett värde ställas in åt gången, men @DataProvider returnerar en 2d-uppsättning objekt .
  • Om DataProvider finns i den andra klassen än den klass där testmetoden finns, ska DataProvider vara en statisk metod .
  • Det finns två parametrar som stöds av DataProvider är Method och ITestContext.