Når vi lager programvare, ønsker vi alltid at det skal fungere annerledes med et annet datasett. Når det gjelder å teste den samme programvaren, kan vi ikke være urettferdig å teste den med bare ett sett med data. Også her må vi bekrefte at systemet vårt tar alle sett med kombinasjoner som forventes å støtte. For det må vi parameterisere testskriptene våre. Her kommer Parameterisering på bildet.
Parameterisering i selen
Parameterisering i Selen er en prosess for å parametere testskriptene for å overføre flere data til applikasjonen ved kjøretid. Det er en utførelsesstrategi som automatisk kjører testsaker flere ganger med forskjellige verdier. Konseptet oppnådd ved å parameterisere testskriptene kalles Data Driven Testing .
I denne veiledningen vil du lære-
- Type parameterisering i TestNG-
- Parameterkommentar med Testng.xml
- Feilsøking
- Parametere ved hjelp av Dataprovider
- Påkalle DataProvider fra annen klasse
- Typer parametere i Dataprovider
Type parameterisering i TestNG-
For å gjøre parameterisering mer tydelig, vil vi gå gjennom parametriseringsalternativene i et av de mest populære rammeverkene for Selenium Webdriver - TestNG .
Det er to måter vi kan oppnå parameterisering på i TestNG
- Ved hjelp av Parameters annotation og TestNG XML- fil.
- Ved hjelp av DataProvider- merknader.
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 -
Parameter Kommentar i TestNG
Parameter Annotation i TestNG er en metode som brukes til å overføre verdier til testmetodene som argumenter ved hjelp av .xml-filen. Brukere kan bli bedt om å overføre verdiene til testmetodene i løpet av løpetiden. @Parameters-merkemetoden kan brukes i hvilken som helst metode som har @Test, @Before, @After eller @Factory-merknad.
Parameterkommentar med Testng.xml
Velg parameterisering ved hjelp av merknader når du ønsker å håndtere kompleksitet og antall inngangskombinasjoner er mindre.
La oss se hvordan dette fungerer
Test Scenario
Trinn 1) Start nettleseren og gå til Google.com
Trinn 2) Skriv inn et søkeord
Trinn 3) Kontroller at den innlagte 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
Test forfatter | Søk nøkkel |
Guru99 | India |
Krishna | USA |
Bhupesh | Kina |
Her er et eksempel på hvordan du gjør det UTEN parametere
pakke parametere;importer org.testng.annotations.Test;importer org.testng.AssertJUnit;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse NoParameterWithTestNGXML {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;@Testpublic void testNoParameter () kaster InterruptedException {Stringforfatter = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Søker etter tekst i google-tekstboksensearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);System.out.println ("Tråden vil sove nå");Tråd. Søvn (3000);System.out.println ("Verdi i Googles søkefelt =" + searchText.getAttribute ("verdi") + "::: Verdi gitt av input =" + searchKey);// verifisere verdien i googles søkefeltAssertJUnit.assertTrue (searchText.getAttribute ("verdi"). EqualsIgnoreCase (searchKey));}}
En studie, eksemplet ovenfor. Tenk deg hvor kompleks koden blir når vi gjør dette for 3 inngangskombinasjoner
La oss nå parameterisere dette ved hjelp av TestNG
For å gjøre det, må du
- Lag en XML-fil som vil lagre parametrene
- I testen legger du til merknad @ Parametre
Her er den fullstendige koden
Testnivå TestNG.xml
xml version = "1.0" koding = "UTF-8"?>
ParameterWithTestNGXML.java-fil
pakke parametere;importer org.testng.AssertJUnit;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;importere org.testng.annotations.Optional;importer org.testng.annotations.Parameters;importer org.testng.annotations.Test;offentlig klasse ParameterWithTestNGXML {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;@Test@Parameters ({"forfatter", "søkekey"})public void testParameterWithXML (@Optional ("Abc") Stringforfatter, String searchKey) kaster InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Søker etter tekst i google-tekstboksensearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);System.out.println ("Tråden vil sove nå");Tråd. Søvn (3000);System.out.println ("Verdi i Googles søkefelt =" + searchText.getAttribute ("verdi") + "::: Verdi gitt av input =" + searchKey);// verifisere verdien i googles søkefeltAssertJUnit.assertTrue (searchText.getAttribute ("verdi"). 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å to nivåer
- Suite-nivå - Parametrene i
-koden til TestNG XML-filen vil være en suite-nivåparameter. - Testnivå - Parametrene i
-koden for å teste XML-filen vil være en testnivåparameter.
Her er den samme testen med parametere på suite-nivå
MERKNAD: I tilfelle hvis parameternavnet er det samme i suite-nivå og testnivå, vil testnivå-parameteren få preferanse over suite-nivå. Så i så fall vil alle klassene på det testnivået dele den overstyrte parameteren, og andre klasser som er utenfor testnivået vil dele suite-nivåparameteren.
Feilsøking
Utgave nr. 1 Parameterverdien i testng.xml kan ikke typestikkes til den tilsvarende testmetodens parameter, det vil gi en feil.
Tenk på følgende eksempel
Her er 'author' -attributtet lik 'Guru99', som er en streng og i tilsvarende testmetode forventes det et heltall, så vi får et unntak her.
Utgave # 2 @Parameters har ikke en tilsvarende verdi i testing.xml.
Du kan løse denne situasjonen ved å legge til @ valgfri kommentar i den tilsvarende parameteren i testmetoden.
Utgave 3: Du vil teste flere verdier av den samme parameteren ved hjelp av 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 må overføre komplekse parametere. Komplekse parametere må opprettes fra Java, for eksempel komplekse objekter, objekter fra eiendomsfiler eller fra en database kan sendes etter dataleverandørmetoden. Metoden er kommentert av @ DataProvider, og den returnerer en rekke objekter.
Parametere ved hjelp av Dataprovider
@Parameters-merknader er enkle, men å teste med flere datasett vi trenger for å bruke dataleverandøren.
For å fylle ut tusenvis av nettskjemaer ved hjelp av testrammeverket vårt, trenger vi en annen metode som kan gi oss et veldig stort datasett i en enkelt utførelsesflyt.
Dette datadrevne konseptet oppnås ved @DataProvider- kommentar i TestNG.
Den har bare ett attributt 'navn' . Hvis du ikke spesifiserer navnattributtet, vil DataProvider-navnet 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 testcase påkalles to ganger med 3 parametere hver gang.
Komplett eksempel
pakke parametere;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.DataProvider;importer org.testng.annotations.Test;offentlig klasse ParameterByDataprovider {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig ugyldig oppsett () {// Opprett Firefox-driverobjektSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Test case for å bekrefte Googles søkefelt* @param forfatter* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) kaster InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// søkeverdi i google søkebokssearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Bekreft om verdien i Googles søkefelt er riktigAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] der første kolonne inneholder 'forfatter'* og andre kolonne inneholder 'searchKey'* /@DataProvider (name = "SearchProvider")offentlig objekt [] [] getDataFromDataprovider () {returner nytt objekt [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Påkalle DataProvider fra annen klasse
Som standard ligger DataProvider i samme klasse der testmetoden er eller dens basisklasse. For å sette det i en annen klasse må vi gjøre dataleverandørmetoden som statisk, og i testmetoden må vi legge til et attributt dataProviderClass i @Test- kommentar.
Kodeeksempel
TestClass ParameterDataproviderWithClassLevel.java
pakke parametere;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.Test;offentlig klasse ParameterDataproviderWithClassLevel {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig ugyldig oppsett () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String author, String searchKey) kaster InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Søk tekst i google tekstfeltsearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);Tråd. Søvn (3000);// få tekst fra søkeboksenStreng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifiser om søkeboksen har riktig verdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
pakke parametere;importer org.testng.annotations.DataProvider;offentlig klasse DataproviderClass {@DataProvider (name = "SearchProvider")offentlig statisk objekt [] [] getDataFromDataprovider () {returner nytt objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Typer parametere i Dataprovider
Det er to typer parametere som støttes av DataProvider-metoden.
Metode - Hvis SAME DataProvider skal oppføre seg annerledes med en annen testmetode, bruk Method-parameteren.
I det følgende eksemplet,
- Vi sjekker om metodens navn er testMethodA.
- Hvis ja, returner ett sett med verdi
- Ellers returner et nytt sett med verdi
pakke parametere;importere java.lang.reflect.Method;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.DataProvider;importer org.testng.annotations.Test;offentlig klasse ParameterByMethodInDataprovider {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTestoffentlig ugyldig oppsett () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (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øketekst i søkefeltetsearchText.sendKeys (searchKey);// Skriv ut forfatter og søkestrengSystem.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Bekreft om Googles tekstboks viser riktig verdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) kaster InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Søketekst i søkefeltetsearchText.sendKeys (searchKey);// Skriv bare søkestrengSystem.out.println ("Velkommen -> Ukjent bruker Søketasten din er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Bekreft om Googles tekstboks viser riktig verdiAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Her returnerer DataProvider verdi på grunnlag av testmetodens navn* @param m* @komme tilbake** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Method m) {hvis (m.getName (). er likIgnoreCase ("testMethodA")) {returner nytt objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}ellers{returner nytt objekt [] [] {{ "Canada" },{ "Russland" },{"Japan"}};}}}
Her er resultatet
ITestContext - Det 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, konfigurasjoner av testen.
I følgende kodeeksempel
- Vi har to grupper A & B
- Hver testmetode tildeles en gruppe
- Hvis verdien av gruppen er A, returneres et bestemt datasett
- Hvis verdien av gruppen er B, returneres et annet datasett
pakke parametere;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.ITestContext;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.DataProvider;importer org.testng.annotations.Test;offentlig klasse ParameterByITestContextInDataprovider {WebDriver driver;Streng driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupper = {"A", "B"})offentlig ugyldig oppsett () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", grupper = "A")public void testMethodA (Stringforfatter, String searchKey) kaster InterruptedException {{// søk google tekstboksWebElement searchText = driver.findElement (By.name ("q"));// søke etter en verdi på densearchText.sendKeys (searchKey);System.out.println ("Velkommen ->" + forfatter + "Søketasten din er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifisere riktig verdi i søkefeltetAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", grupper = "B")public void testMethodB (String searchKey) kaster InterruptedException {{// finn google søkefeltWebElement searchText = driver.findElement (By.name ("q"));// søke etter en verdi på densearchText.sendKeys (searchKey);System.out.println ("Velkommen -> Ukjent bruker Søketasten din er ->" + searchKey);Tråd. Søvn (3000);Streng testValue = searchText.getAttribute ("verdi");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifisere riktig verdi i søkefeltetAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Her vil DAtaProvider tilby Object array på grunnlag av ITestContext* @param c* @komme tilbake* /@DataProvider (name = "SearchProvider")offentlig objekt [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;for (strenggruppe: c.getIncludedGroups ()) {hvis (group.equalsIgnoreCase ("A")) {groupArray = nytt objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};gå i stykker;}annet hvis (group.equalsIgnoreCase ("B")){groupArray = nytt objekt [] [] {{ "Canada" },{ "Russland" },{"Japan"}};}gå i stykker;}returgruppeArray;}}
Merk: Hvis du kjører testng-klassen direkte, vil den først ringe dataleverandøren som ikke kan få gruppeinformasjon ettersom 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 å ringe testen
Sammendrag :
- Parametrering er nødvendig for å opprette datadrevet testing .
- TestNG støtter to typer parameterisering, ved hjelp av @ Parameter + TestNG.xml og bruk av @DataProvider
- I @ Parameter + TestNG.xml kan parametere plasseres på suite-nivå og testnivå. Hvis
Det samme parameternavnet er erklært begge steder; testnivåparameter vil få preferanse fremfor parameter for dressnivå.
- ved hjelp av @ Parameter + TestNG.xml kan bare én verdi angis om gangen, men @DataProvider returnerer et 2d-utvalg av objekt .
- Hvis DataProvider er tilstede i den forskjellige klassen, skal klassen der testmetoden ligger, DataProvider være en statisk metode .
- Det er to parametere som støttes av DataProvider, er Method og ITestContext.