Dataprovider & TestNG XML: Parameterisering i selen (eksempel)

Indholdsfortegnelse:

Anonim

Når vi opretter software, ønsker vi altid, at det skal fungere anderledes med et andet datasæt. Når det kommer til at teste det samme stykke software, kan vi ikke være uretfærdige med at teste det med kun et sæt data. Også her er vi nødt til at kontrollere, at vores system tager alle de kombinationer, som forventes at understøtte. Til det er vi nødt til at parametrere vores test scipts. Her kommer parametrering på billedet.

Parameterisering i selen

Parametrering i selen er en proces til parametrering af testskripterne for at videregive flere data til applikationen ved kørselstid. Det er en udførelsesstrategi, der automatisk kører testsager flere gange ved hjælp af forskellige værdier. Konceptet opnået ved parametrering af testskripter kaldes Data Driven Testing .

I denne vejledning lærer du-

  • Parameteriseringstype i TestNG-
  • Parameter annotation med Testng.xml
  • Fejlfinding
  • Parametre ved hjælp af Dataprovider
  • Påkald DataProvider fra en anden klasse
  • Typer af parametre i Dataprovider

Parameteriseringstype i TestNG-

For at gøre parametrering mere klar, vil vi gennemgå parametriseringsindstillingerne i en af ​​de mest populære rammer for Selenium Webdriver - TestNG .

Der er to måder, hvorpå vi kan opnå parametrering i TestNG

  1. Ved hjælp af Parameters annotation og TestNG XML- fil.

  2. Ved hjælp af DataProvider- kommentar.

Parametre fra Testng.xml kan være suite eller testniveau

Parameter fra DataProvider kan tage Method og ITestContext som parameter.

Lad os studere dem detaljeret -

Parameter Annotation i TestNG

Parameter Annotation i TestNG er en metode, der bruges til at overføre værdier til testmetoderne som argumenter ved hjælp af .xml-fil. Brugere kan blive bedt om at videregive værdierne til testmetoderne i løbet af løbetiden. @Parameters-annoteringsmetoden kan bruges i enhver metode, der har @Test, @Before, @After eller @Factory-kommentar.

Parameter annotation med Testng.xml

Vælg parameterisering ved hjælp af annoteringer, når du ønsker at håndtere kompleksitet, og antallet af inputkombinationer er mindre.

Lad os se, hvordan dette fungerer

Testscenarie

Trin 1) Start browseren, og gå til Google.com

Trin 2) Indtast et søgeord

Trin 3) Kontroller, at den indtastede værdi er den samme som den, der leveres af vores testdata

Trin 4) Gentag 2 & 3, indtil alle værdier er indtastet

Test forfatter Søgeknap
Guru99 Indien
Krishna USA
Bhupesh Kina

Her er et eksempel på, hvordan man gør det Uden parametre

pakke parametre;import org.testng.annotations.Test;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse NoParameterWithTestNGXML {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;@Prøvepublic void testNoParameter () kaster InterruptedException {Stringforfatter = "guru99";String searchKey = "indien";System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Søger tekst i google tekstfeltsearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);System.out.println ("Tråden sover nu");Tråd. Søvn (3000);System.out.println ("Værdi i Google-søgefelt =" + searchText.getAttribute ("værdi") + "::: Værdi givet ved input =" + searchKey);// verificering af værdien i google-søgefeltetAssertJUnit.assertTrue (searchText.getAttribute ("værdi"). EqualsIgnoreCase (searchKey));}}

En undersøgelse, ovenstående eksempel. Forestil dig, hvor kompleks koden bliver, når vi gør dette til 3 inputkombinationer

Lad os nu parametrere dette ved hjælp af TestNG

For at gøre det skal du

  • Opret en XML-fil, der gemmer parametrene
  • I testen skal du tilføje kommentar @ Parametre

Her er den komplette kode

Testniveau TestNG.xml




ParameterWithTestNGXML.java-fil

pakke parametre;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;importer 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;offentlig klasse ParameterWithTestNGXML {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;@Prøve@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Stringforfatter, String searchKey) kaster InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Søger tekst i google tekstfeltsearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);System.out.println ("Tråden sover nu");Tråd. Søvn (3000);System.out.println ("Værdi i Google-søgefelt =" + searchText.getAttribute ("værdi") + "::: Værdi givet ved input =" + searchKey);// verificering af værdien i google-søgefeltetAssertJUnit.assertTrue (searchText.getAttribute ("værdi"). EqualsIgnoreCase (searchKey));}}

Instruktioner til at køre scriptet, vælg XML-filen og Kør som test NG Suite

Højreklik på .xml-fil -> Kør som -> Testng Suite (Bemærk: Suite)

Nu kan parametre defineres på 2 niveauer

  1. Suite-niveau - Parametrene inde i -tagget i TestNG XML-filen vil være en suite-niveau-parameter.
  2. Testniveau - Parametrene inde i -tagget til testning af XML-fil er en parameter på testniveau.

Her er den samme test med parametre på suite-niveau

BEMÆRK: Hvis parameternavnet er det samme i suite-niveau og testniveau, får test-niveau-parameteren præference over suite-niveau. Så i så fald deler alle klasser inden for dette testniveau den tilsidesatte parameter, og andre klasser, der er uden for testniveau, deler suite-niveauparameter.

Fejlfinding

Udgave nr. 1 Parameterværdi i testng.xml kan ikke typestyres til den tilsvarende testmetodes parameter, det vil give en fejl.

Overvej følgende eksempel

Her er 'author' -attribut lig med 'Guru99', som er en streng, og i den tilsvarende testmetode forventer den en heltalværdi, så vi får en undtagelse her.

Udgave nr. 2 Dine @parametre har ikke en tilsvarende værdi i testing.xml.

Du kan løse denne situation ved at tilføje @ valgfri kommentar i den tilsvarende parameter i testmetoden.

Udgave nr. 3: Du vil teste flere værdier for den samme parameter ved hjælp af Testng.xml

Det enkle svar er, at dette ikke kan gøres! Du kan have flere forskellige parametre, men hver parameter kan kun have en enkelt værdi. Dette hjælper med at forhindre hardcoding-værdier i scriptet. Dette gør kode genanvendelig. Tænk på det som konfigurationsfiler til dit script. Hvis du vil bruge flere værdier til en parameter, skal du bruge DataProviders

Dataudbyder i TestNG

Dataudbyder i TestNG er en metode, der bruges, når en bruger skal overføre komplekse parametre. Komplekse parametre skal oprettes fra Java, såsom komplekse objekter, objekter fra egenskabsfiler eller fra en database kan videregives ved hjælp af dataudbydermetoden. Metoden annoteres af @DataProvider, og den returnerer en række objekter.

Parametre ved hjælp af Dataprovider

@Parameters-annotering er let, men at teste med flere datasæt, vi har brug for til at bruge Data Provider.

For at udfylde tusinder af webformularer ved hjælp af vores testramme har vi brug for en anden metode, der kan give os et meget stort datasæt i en enkelt eksekveringsstrøm.

Dette datadrevne koncept opnås ved @DataProvider- kommentar i TestNG.

Det har kun en attribut 'navn' . Hvis du ikke angiver navneattribut, vil DataProvider-navnet være det samme som det tilsvarende metodenavn.

Dataleverandøren returnerer et todimensionalt JAVA-objekt til testmetoden og testmetoden, påberåber M gange i en M * N-type objektmatrix. For eksempel, hvis DataProvider returnerer en matrix med 2 * 3 objekter, påkræves den tilsvarende testcase 2 gange med 3 parametre hver gang.

Komplet eksempel

pakke parametre;import java.util.concurrent.TimeUnit;importer 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;offentlig klasse ParameterByDataprovider {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsopsætning () {// Opret firefox driverobjektSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Test sag for at bekræfte google søgefelt* @param forfatter* @param searchKey* @ kaster InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (Stringforfatter, String searchKey) kaster InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// søgningsværdi i google søgefeltsearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Kontroller, om værdien i google-søgefeltet er korrektAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Objekt [] [] hvor første kolonne indeholder 'forfatter'* og anden kolonne indeholder 'searchKey'* /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider () {returner nyt objekt [] []{{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Påkald DataProvider fra en anden klasse

DataProvider ligger som standard i samme klasse, hvor testmetoden er eller dens basisklasse. For at sætte det i en anden klasse er vi nødt til at gøre dataudbydermetoden som statisk, og i testmetoden skal vi tilføje en attribut dataProviderClass i @Test- kommentar.

Kodeeksempel

TestClass ParameterDataproviderWithClassLevel.java

pakke parametre;import java.util.concurrent.TimeUnit;importer 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;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsopsætning () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (Stringforfatter, String searchKey) kaster InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Søg tekst i google tekstfeltsearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);Tråd. Søvn (3000);// få tekst fra søgefeltetStreng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// kontrollere, om søgefeltet har den korrekte værdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

pakke parametre;import org.testng.annotations.DataProvider;offentlig klasse DataproviderClass {@DataProvider (name = "SearchProvider")offentligt statisk objekt [] [] getDataFromDataprovider () {returner nyt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Typer af parametre i Dataprovider

Der er to typer parametre, der understøttes af DataProvider-metoden.

Metode - Hvis SAME DataProvider skal opføre sig forskelligt med en anden testmetode, skal du bruge Metodeparameter.

I det følgende eksempel

  • Vi kontrollerer om metodens navn er testMethodA.
  • Hvis ja, returner et sæt værdi
  • Ellers returner et andet sæt værdier
pakke parametre;importere java.lang.reflect.Methode;import java.util.concurrent.TimeUnit;importer 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;offentlig klasse ParameterByMethodInDataprovider {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig tomrumsopsætning () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (Stringforfatter, String searchKey) kaster InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Søg tekst i søgefeltetsearchText.sendKeys (searchKey);// Udskriv forfatter og søgestrengSystem.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Kontroller, om google-tekstfeltet viser den korrekte værdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) kaster InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Søg tekst i søgefeltetsearchText.sendKeys (searchKey);// Udskriv kun søgestrengSystem.out.println ("Velkommen -> Ukendt bruger Din søgetast er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Kontroller, om google-tekstfeltet viser den korrekte værdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Her returnerer DataProvider værdi på baggrund af testmetodens navn* @param m* @Vend tilbage** /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider (Metode m) {hvis (m.getName (). er lig medIgnoreCase ("testMethodA")) {returner nyt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}andet{returner nyt objekt [] [] {{"Canada"},{"Rusland"},{"Japan"}};}}}

Her er output

ITestContext - Det kan bruge til at oprette forskellige parametre til testsager baseret på grupper.

I det virkelige liv kan du bruge ITestContext til at variere parameterværdier baseret på testmetoder, værter, testkonfigurationer.

I det følgende kodeeksempel

  • Vi har 2 grupper A & B
  • Hver testmetode tildeles en gruppe
  • Hvis værdien for gruppen er A, returneres et bestemt datasæt
  • Hvis værdien for gruppen er B, returneres et andet datasæt
pakke parametre;import java.util.concurrent.TimeUnit;importer 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;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupper = {"A", "B"})offentlig tomrumsopsætning () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", grupper = "A")public void testMethodA (Stringforfatter, String searchKey) kaster InterruptedException {{// søg google tekstboksWebElement searchText = driver.findElement (By.name ("q"));// søg en værdi på densearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Din søgenøgle er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// kontrollere den korrekte værdi i søgefeltetAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", grupper = "B")public void testMethodB (String searchKey) kaster InterruptedException {{// find google-søgefeltWebElement searchText = driver.findElement (By.name ("q"));// søg en værdi på densearchText.sendKeys (searchKey);System.out.println ("Velkommen -> Ukendt bruger Din søgetast er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("værdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// kontrollere den korrekte værdi i søgefeltetAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Her leverer DAtaProvider Object array på basis af ITestContext* @param c* @Vend tilbage* /@DataProvider (name = "SearchProvider")offentligt objekt [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;for (String group: c.getIncludedGroups ()) {hvis (group.equalsIgnoreCase ("A")) {groupArray = nyt objekt [] [] {{"Guru99", "Indien"},{"Krishna", "UK"},{"Bhupesh", "USA"}};pause;}ellers hvis (group.equalsIgnoreCase ("B")){groupArray = nyt objekt [] [] {{"Canada"},{"Rusland"},{"Japan"}};}pause;}returgruppeArray;}}

Bemærk: Hvis du kører din testng-klasse direkte, ringer den først til dataprovider, som ikke kan få gruppeoplysninger, da grupper ikke er tilgængelige. Men i stedet for hvis du kalder denne klasse via testng.xml, vil den have gruppeinformation tilgængelig med ITestContext. Brug følgende XML til at kalde testen

Resume :

  • Parametrering kræves for at oprette datadrevet test .
  • TestNG understøtter to slags parametrering ved hjælp af @ Parameter + TestNG.xml og ved hjælp af @DataProvider
  • I @ Parameter + TestNG.xml kan parametre placeres i suite-niveau og testniveau. Hvis

    Det samme parameternavn erklæres begge steder; testniveau-parameter får præference frem for jakkesæt-niveau-parameter.

  • ved hjælp af @ Parameter + TestNG.xml kan der kun indstilles en værdi ad gangen, men @DataProvider returnerer et 2d-array af objekt .
  • Hvis DataProvider er til stede i den anden klasse end den klasse, hvor testmetoden opholder sig, skal DataProvider være en statisk metode .
  • Der er to parametre, der understøttes af DataProvider, er Method og ITestContext.