Ko ustvarjamo programsko opremo, si vedno želimo, da bi z drugačnim naborom podatkov delovala drugače. Ko gre za testiranje istega dela programske opreme, ne moremo biti krivično, če ga preizkusimo z enim samim nizom podatkov. Tudi tu moramo preveriti, ali naš sistem uporablja vse kombinacije, ki naj bi jih podpiral. Za to moramo parametrirati naše testne znake. Tu prihaja Parametrizacija na sliki.
Parametriranje v selenu
Parametriranje v seleniju je postopek za parameterizacijo testnih skriptov, da se aplikaciji med izvajanjem posredujejo več podatkov. To je strategija izvajanja, ki samodejno večkrat zažene testne primere z uporabo različnih vrednosti. Koncept, dosežen s parametriranjem testnih skriptov, se imenuje testiranje na osnovi podatkov .
V tej vadnici boste izvedeli-
- Vrsta parametrizacije v TestNG-
- Opomba parametrov s testng.xml
- Odpravljanje težav
- Parametri z uporabo Dataproviderja
- Prikličite DataProvider iz drugega razreda
- Vrste parametrov v ponudniku podatkov
Vrsta parametrizacije v TestNG-
Da bo parametrizacija bolj jasna, bomo pregledali možnosti parametrizacije v enem najbolj priljubljenih okvirov za Selenium Webdriver - TestNG .
Na dva načina lahko dosežemo parametrizacijo v TestNG
- S pomočjo pripisa parametrov in datoteke XML TestNG .
- S pomočjo pripisa DataProvider .
Parametri iz Testng.xml so lahko paket ali preskusna raven
Parameter iz DataProvider lahko za parameter vzame Method in ITestContext.
Podrobno jih preučimo -
Opomba parametrov v TestNG
Opomba parametrov v TestNG je metoda, ki se uporablja za posredovanje vrednosti testnim metodam kot argumentov z uporabo datoteke .xml. Uporabniki bodo morda morali med izvajanjem vrednosti posredovati vrednosti testnim metodam. Metoda označevanja @Parameters se lahko uporablja v kateri koli metodi, ki ima oznake @Test, @Before, @After ali @Factory.
Opomba parametrov s testng.xml
Izberite parametrizacijo z uporabo pripisov, če se želite spoprijeti s kompleksnostjo in je število vnosnih kombinacij manjše.
Poglejmo, kako to deluje
Preskusni scenarij
Korak 1) Zaženite brskalnik in pojdite na Google.com
Korak 2) Vnesite ključno besedo za iskanje
Korak 3) Preverite, ali je vnesena vrednost enaka vrednosti, ki jo zagotavljajo naši testni podatki
Korak 4) Ponavljajte 2 in 3, dokler ne vnesete vseh vrednosti
Avtor preizkusa | SearchKey |
Guru99 | Indija |
Krišna | ZDA |
Bupeš | Kitajska |
Tu je primer, kako to narediti BREZ parametrov
parametri paketa;import org.testng.annotations.Test;import org.testng.AssertJUnit;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.firefox.FirefoxDriver;javni razred NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Gonilnik WebDriver;@Testpublic void testNoParameter () vrže InterruptedException {Avtor niza = "guru99";String searchKey = "indija";System.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Iskanje besedila v google besedilnem poljusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);System.out.println ("Nit bo zdaj spal");Navoj.spanje (3000);System.out.println ("Vrednost v iskalnem polju Google =" + searchText.getAttribute ("vrednost") + "::: Vrednost podana z input =" + searchKey);// preverjanje vrednosti v iskalnem polju GoogleAssertJUnit.assertTrue (searchText.getAttribute ("vrednost"). EqualsIgnoreCase (searchKey));}}
Študija, zgornji primer. Samo predstavljajte si, kako zapletena bo koda postala, ko bomo to storili za 3 kombinacije vnosa
Zdaj pa to parametrirajmo s testNG
Če želite to narediti, boste morali
- Ustvarite datoteko XML, v kateri bodo shranjeni parametri
- V preskusu dodajte pripis @Parameters
Tu je celotna koda
Test Level TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Datoteka ParameterWithTestNGXML.java
parametri paketa;import org.testng.AssertJUnit;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.firefox.FirefoxDriver;uvoz org.testng.annotations.Obvezno;import org.testng.annotations.Parameters;import org.testng.annotations.Test;javni razred ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Gonilnik WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Avtor niza, String searchKey) vrže InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Iskanje besedila v google besedilnem poljusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);System.out.println ("Nit bo zdaj spal");Navoj.spanje (3000);System.out.println ("Vrednost v iskalnem polju Google =" + searchText.getAttribute ("vrednost") + "::: Vrednost podana z input =" + searchKey);// preverjanje vrednosti v iskalnem polju GoogleAssertJUnit.assertTrue (searchText.getAttribute ("vrednost"). EqualsIgnoreCase (searchKey));}}
Navodila za zagon skripta, izberite datoteko XML in zaženi kot Test NG Suite
Z desno miškino tipko kliknite datoteko .xml -> Zaženi kot -> Testng Suite (Opomba: Suite)
Zdaj lahko parametre določimo na dveh ravneh
- Raven zbirke - parametri v oznaki
datoteke TestNG XML bodo parameter ravni suite. - Test Level - Parametri znotraj oznake
preskusne datoteke XML bodo parameter Test level.
Tu je isti test s parametri na ravni suite
OPOMBA: V primeru, da je ime parametra na ravni suite in preizkusni ravni enako, bo parameter preizkusne ravni imel prednost pred ravnijo suite. Torej bodo v tem primeru vsi razredi znotraj te preizkusne ravni delili nadomeščeni parameter, drugi razredi, ki so izven preizkusne ravni, pa bodo imeli skupni parameter.
Odpravljanje težav
Vprašanje št. 1 Vrednosti parametra v testng.xml ni mogoče pretvoriti v tip ustreznega parametra preskusne metode, kar bo povzročilo napako.
Razmislite o naslednjem primeru
Tu je atribut 'author' enak 'Guru99', ki je niz in v ustrezni preskusni metodi pričakuje celoštevilčno vrednost, zato bomo tu dobili izjemo.
2. številka Vaši @Parametri nimajo ustrezne vrednosti v test.xml.
To situacijo lahko rešite tako, da v ustrezni parameter v testni metodi dodate oznako @optional .
3. vprašanje: Želite preizkusiti več vrednosti istega parametra z uporabo Testng.xml
Preprost odgovor je, da tega ni mogoče storiti! Lahko imate več različnih parametrov, vendar ima lahko vsak parameter samo eno vrednost. To pomaga preprečiti trdo kodiranje vrednosti v skriptu. Zaradi tega je koda večkrat uporabna. Mislite na to kot na konfiguracijske datoteke za vaš skript. Če želite za parameter uporabiti več vrednosti, uporabite DataProviders
Ponudnik podatkov v TestNG
Ponudnik podatkov v TestNG je metoda, ki se uporablja, ko mora uporabnik prenesti kompleksne parametre. Zapletene parametre je treba ustvariti iz Jave, na primer zapletene predmete, predmete iz datotek lastnosti ali iz baze podatkov, ki jih lahko posreduje metoda ponudnika podatkov. Metoda je označena z @DataProvider in vrne vrsto predmetov.
Parametri z uporabo Dataproviderja
Opomba @Parameters je enostavna, a za preskušanje z več nabori podatkov moramo uporabiti ponudnika podatkov.
Za izpolnjevanje tisočih spletnih obrazcev z uporabo našega testnega okvira potrebujemo drugačno metodologijo, ki nam lahko da zelo velik nabor podatkov v enem samem izvedbenem toku.
Ta koncept, ki temelji na podatkih, je dosežen s pripisom @DataProvider v TestNG.
Ima samo en atribut 'ime' . Če ne navedete atributa imena, bo ime DataProviderja enako imenu ustrezne metode.
Ponudnik podatkov preskusni metodi vrne dvodimenzionalni objekt JAVA in preskusna metoda bo M-N priklicala v vrsti predmetne matrike M * N. Če na primer DataProvider vrne matriko objektov 2 * 3, bo ustrezni testni primer vsakič poklican dvakrat s 3 parametri.
Popoln primer
parametri paketa;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;javni razred ParameterByDataprovider {Gonilnik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavitev javne praznine () {// Ustvari objekt gonilnika firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Preskusni primer za preverjanje Googlovega iskalnega polja* @param avtor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (avtor niza, String searchKey) vrže InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// vrednost iskanja v iskalnem polju GooglesearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);Niz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Preverite, ali je vrednost v iskalnem polju Google pravilnaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], kjer prvi stolpec vsebuje 'avtorja'* in drugi stolpec vsebuje "searchKey"* /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider () {vrni nov objekt [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "ZDA"}};}}
Prikličite DataProvider iz drugega razreda
DataProvider je privzeto v istem razredu, kjer je preskusna metoda ali njen osnovni razred. Če ga želimo uvrstiti v drug razred, moramo metodo ponudnika podatkov narediti kot statično, v testni pa dodati atribut dataProviderClass v opombo @Test .
Primer kode
TestClass ParameterDataproviderWithClassLevel.java
parametri paketa;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;javni razred ParameterDataproviderWithClassLevel {Gonilnik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavitev javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (avtor niza, String searchKey) vrže InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Iskanje besedila v google besedilnem poljusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);// dobimo besedilo iz iskalnega poljaNiz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// preverimo, ali ima iskalno polje pravilno vrednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parametri paketa;import org.testng.annotations.DataProvider;javni razred DataproviderClass {@DataProvider (name = "SearchProvider")javni statični objekt [] [] getDataFromDataprovider () {vrni nov objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "ZDA"}};}}
Vrste parametrov v ponudniku podatkov
Metoda DataProvider podpira dve vrsti parametrov.
Metoda - Če se SAME DataProvider obnaša drugače pri drugačni preskusni metodi, uporabite parameter Method.
V naslednjem primeru
- Preverimo, ali je ime metode testMethodA.
- Če je odgovor da, vrnite en niz vrednosti
- V nasprotnem primeru vrne še en niz vrednosti
parametri paketa;uvoz java.lang.reflect.Method;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;javni razred ParameterByMethodInDataprovider {Gonilnik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavitev javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (Avtor niza, String searchKey) vrže InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Iskanje besedila v iskalnem poljusearchText.sendKeys (searchKey);// Natisni avtorja in iskalni nizSystem.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);Niz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Preverite, ali Googlovo besedilno polje prikazuje pravilno vrednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) vrže InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Iskanje besedila v iskalnem poljusearchText.sendKeys (searchKey);// Natisni samo iskalni nizSystem.out.println ("Dobrodošli -> Neznan uporabnik Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);Niz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Preverite, ali Googlovo besedilno polje prikazuje pravilno vrednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tu DataProvider vrne vrednost na podlagi imena preskusne metode* @param m* @ vrni se** /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider (metoda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {vrni nov objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "ZDA"}};}sicer {vrni nov objekt [] [] {{"Kanada"},{"Rusija"},{"Japonska"}};}}}
Tukaj je rezultat
ITestContext - Z njim lahko ustvarite različne parametre za testne primere na podlagi skupin.
V resnici lahko s pomočjo ITestContext spreminjate vrednosti parametrov glede na testne metode, gostitelje in konfiguracije testa.
V naslednjem primeru kode
- Imamo dve skupini A & B
- Vsaka preskusna metoda je dodeljena skupini
- Če je vrednost skupine A, se vrne določen nabor podatkov
- Če je vrednost skupine B, se vrne drug nabor podatkov
parametri paketa;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz 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;javni razred ParameterByITestContextInDataprovider {Gonilnik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (skupine = {"A", "B"})nastavitev javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);voznik = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (Avtor niza, String searchKey) vrže InterruptedException {{// išči google besediloWebElement searchText = driver.findElement (By.name ("q"));// poiščemo vrednost na njemsearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + avtor + "Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);Niz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// preverimo pravilno vrednost v iskalnem poljuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) vrže InterruptedException {{// poiščemo iskalno polje GoogleWebElement searchText = driver.findElement (By.name ("q"));// poiščemo vrednost na njemsearchText.sendKeys (searchKey);System.out.println ("Dobrodošli -> Neznan uporabnik Vaša iskalna tipka je ->" + searchKey);Navoj.spanje (3000);Niz testValue = searchText.getAttribute ("vrednost");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// preverimo pravilno vrednost v iskalnem poljuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tu bo DAtaProvider zagotovil polje Object na osnovi ITestContext* @param c* @ vrni se* /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;za (Skupina nizov: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nov objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "ZDA"}};odmor;}sicer če (group.equalsIgnoreCase ("B")){groupArray = nov objekt [] [] {{"Kanada"},{"Rusija"},{"Japonska"}};}odmor;}vrni groupArray;}}
Opomba: Če neposredno zaženete razred testng, bo najprej poklical ponudnika podatkov, ki ne more dobiti informacij o skupinah, saj skupine niso na voljo. Če pa ta razred pokličete prek testng.xml, bo imel informacije o skupinah na voljo z ITestContext. Za klic testa uporabite naslednji XML
Povzetek :
- Parametriranje je potrebno za ustvarjanje podatkovnega preskušanja .
- TestNG podpira dve vrsti parametrizacije, z @ Parameter + TestNG.xml in z @DataProvider
- V @ Parameter + TestNG.xml lahko parametre postavite na nivo suite in preizkus. Če
Na obeh mestih je navedeno isto ime parametra; parameter testne ravni bo imel prednost pred parametrom ravni obleke.
- z @ Parameter + TestNG.xml lahko nastavite samo eno vrednost naenkrat, vendar @DataProvider vrne 2d matriko Object .
- Če je dataProvider prisotna v drugem razredu pa razred, kjer se preizkusna metoda prebiva, dataProvider mora biti statična metoda .
- DataProvider podpira dva parametra : Method in ITestContext.