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
- Ved hjælp af Parameters annotation og TestNG XML- fil.
- 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
xml version = "1.0" kodning = "UTF-8"?>
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
- Suite-niveau - Parametrene inde i
-tagget i TestNG XML-filen vil være en suite-niveau-parameter. - 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.