Dok stvaramo softver, uvijek želimo da bi trebao raditi drugačije s različitim skupom podataka. Što se tiče testiranja istog dijela softvera, ne možemo biti nepravedni da ga testiramo sa samo jednim setom podataka. I ovdje moramo potvrditi da naš sustav uzima sve kombinacije za koje se očekuje da podržavaju. Za to trebamo parameterizirati naše testne znakove. Evo parametrizacije na slici.
Parametarizacija u selenu
Parametriranje u seleniju je postupak parameterizacije testnih skripti kako bi se više podataka aplikaciji proslijedilo u vrijeme izvođenja. To je strategija izvršenja koja automatski pokreće test slučajeve više puta koristeći različite vrijednosti. Koncept postignut parametriziranjem testnih skripti naziva se Data Driven Testing .
U ovom vodiču naučit ćete-
- Vrsta parametrizacije u TestNG-
- Anotacija parametara s Testng.xml
- Rješavanje problema
- Parametri koji koriste Dataprovider
- Pozovite DataProvider iz druge klase
- Vrste parametara u pružatelju podataka
Vrsta parametrizacije u TestNG-
Da bi parametarizacija bila jasnija, proći ćemo kroz opcije parametrizacije u jednom od najpopularnijih okvira za Selenium Webdriver - TestNG .
Postoje dva načina na koja možemo postići parametrizaciju u TestNG-u
- Uz pomoć napomene Parametri i XML datoteke TestNG .
- Uz pomoć anotacije DataProvider .
Parametri iz Testng.xml mogu biti paket ili razina testa
Parametar iz DataProvider-a može uzeti parametar Method i ITestContext.
Proučimo ih detaljno -
Napomena parametara u TestNG-u
Bilješka parametara u TestNG je metoda koja se koristi za prosljeđivanje vrijednosti test metodama kao argumente pomoću .xml datoteke. Od korisnika se može tražiti da vrijednosti predaju metodama ispitivanja tijekom vremena izvođenja. Metoda bilježenja @Parameters može se koristiti u bilo kojoj metodi koja sadrži oznake @Test, @Before, @After ili @Factory.
Anotacija parametara s Testng.xml
Odaberite parametrizaciju pomoću bilješki kada se želite nositi sa složenošću i broj kombinacija unosa je manji.
Da vidimo kako ovo funkcionira
Testni scenarij
Korak 1) Pokrenite preglednik i idite na Google.com
Korak 2) Unesite ključnu riječ za pretraživanje
Korak 3) Provjerite je li unesena vrijednost ista kao ona koju pružaju naši test podaci
Korak 4) Ponavljajte 2 i 3 dok se ne unesu sve vrijednosti
Autor testa | SearchKey |
Guru99 | Indija |
Krišna | SAD |
Bupeš | Kina |
Evo primjera kako to učiniti BEZ parametara
parametri paketa;import org.testng.annotations.Test;import org.testng.AssertJUnit;import 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;javna klasa NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Upravljački program za WebDriver;@Testpublic void testNoParameter () baca InterruptedException {Autor niza = "guru99";String searchKey = "indija";System.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Pretraživanje teksta u google tekstualnom okvirusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);System.out.println ("Nit će sada spavati");Navoj.spavanje (3000);System.out.println ("Vrijednost u Google Search Box =" + searchText.getAttribute ("value") + "::: Vrijednost data input =" + searchKey);// provjera vrijednosti u okviru za pretraživanje GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}
Studija, gornji primjer. Zamislite koliko će složeni kod postati složen kad to napravimo za 3 kombinacije unosa
Ajmo sada parameterizirati ovo pomoću TestNG-a
Da biste to učinili, morat ćete
- Stvorite XML datoteku koja će pohraniti parametre
- U testu dodajte napomenu @Parameters
Evo kompletnog koda
Test razina TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Datoteka ParameterWithTestNGXML.java
parametri paketa;import org.testng.AssertJUnit;import 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.annotations.O optional;import org.testng.annotations.Parameters;import org.testng.annotations.Test;javna klasa ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Upravljački program za WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Autor niza, String searchKey) baca InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Pretraživanje teksta u google tekstualnom okvirusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);System.out.println ("Nit će sada spavati");Navoj.spavanje (3000);System.out.println ("Vrijednost u Google Search Box =" + searchText.getAttribute ("value") + "::: Vrijednost data input =" + searchKey);// provjera vrijednosti u okviru za pretraživanje GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}
Upute za pokretanje skripte, odaberite XML datoteku i pokrenite kao Test NG Suite
Desni klik na .xml datoteku -> Pokreni kao -> Testng Suite (Napomena: Suite)
Sada se parametri mogu definirati na 2 razine
- Razina paketa - parametri unutar oznake
datoteke TestNG XML bit će parametar paketa. - Razina ispitivanja - parametri unutar oznake
testiranja XML datoteke bit će parametar razine ispitivanja.
Evo istog testa s parametrima na razini paketa
NAPOMENA: U slučaju da je naziv parametra isti na razini paketa i razini ispitivanja, tada će parametar razine testa imati prednost u odnosu na razinu paketa. Dakle, u tom će slučaju sve klase unutar te razine ispitivanja dijeliti nadjačani parametar, a ostale klase izvan razine testa dijelit će parametar razine paketa.
Rješavanje problema
Pitanje # 1 Vrijednost parametra u testng.xml ne može se pretočiti u odgovarajući parametar odgovarajuće metode ispitivanja, što će dovesti do pogreške.
Razmotrimo sljedeći primjer
Ovdje je atribut 'author' jednak 'Guru99' koji je niz i u odgovarajućoj testnoj metodi očekuje cijelu vrijednost, pa ćemo ovdje dobiti iznimku.
2. izdanje Vaši @Parametri nemaju odgovarajuću vrijednost u testing.xml.
Ovu situaciju možete riješiti dodavanjem oznake @optional u odgovarajući parametar u testnoj metodi.
3. izdanje: Želite testirati više vrijednosti istog parametra pomoću Testng.xml
Jednostavan odgovor je da se to ne može učiniti! Možete imati više različitih parametara, ali svaki parametar može imati samo jednu vrijednost. To pomaže u sprječavanju vrijednosti kodiranja u skripti. To čini kod višekratnim. Shvatite to kao konfiguracijske datoteke za vašu skriptu. Ako želite koristiti više vrijednosti za parametar, koristite DataProviders
Davatelj podataka u TestNG-u
Davatelj podataka u TestNG- u metoda je koja se koristi kada korisnik treba proslijediti složene parametre. Složene parametre treba stvoriti iz Jave, poput složenih objekata, objekata iz datoteka svojstava ili iz baze podataka koji se mogu proslijediti metodom davatelja podataka. Metoda je označena @DataProvider i vraća niz objekata.
Parametri koji koriste Dataprovider
Anotacija @Parameters je jednostavna, ali za testiranje s više skupova podataka trebamo koristiti Davatelja podataka.
Da bismo ispunili tisuće web obrazaca pomoću našeg okvira za testiranje, potrebna nam je drugačija metodologija koja nam može dati vrlo velik skup podataka u jednom tijeku izvršenja.
Ovaj koncept podaci pokreće se postiže @DataProvider zapažanje u TestNG.
Ima samo jedan atribut 'ime' . Ako ne navedete atribut imena, tada će naziv DataProvider-a biti isti kao i naziv odgovarajuće metode.
Davatelj podataka vraća dvodimenzionalni JAVA objekt na metodu ispitivanja, a metoda ispitivanja pozivat će M puta u M * N vrsti objekata. Na primjer, ako DataProvider vrati niz od 2 * 3 objekta, odgovarajući testcase bit će pozvan 2 puta s 3 parametra svaki put.
Potpuni primjer
parametri paketa;import 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;javna klasa ParameterByDataprovider {Upravljački program za WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpostavljanje javne praznine () {// Stvaranje objekta upravljačkog programa za FirefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Test slučaj za potvrdu okvira za pretraživanje Google* @param autor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")javna void testMethod (Autor niza, String searchKey) baca InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// vrijednost pretraživanja u Google pretraživačkom okvirusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);Navoj.spavanje (3000);Niz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// Provjerite je li vrijednost u Googleovom okviru za pretraživanje točnaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] gdje prvi stupac sadrži 'autora'* i drugi stupac sadrži "searchKey"* /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider () {vrati novi objekt [] []{{"Guru99", "Indija"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Pozovite DataProvider iz druge klase
Prema zadanim postavkama DataProvider se nalazi u istoj klasi u kojoj je metoda ispitivanja ili osnovna klasa. Staviti ga u nekom drugom razredu moramo napraviti metodu podataka usluga kao statike i metode ispitivanja moramo dodati atribut dataProviderClass u @Test komentaru.
Primjer koda
TestClass ParameterDataproviderWithClassLevel.java
parametri paketa;import 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;javna klasa ParameterDataproviderWithClassLevel {Upravljački program za WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpostavljanje javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)javna void testMethod (Autor niza, String searchKey) baca InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Pretraživanje teksta u google tekstualnom okvirusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);Navoj.spavanje (3000);// dobivanje teksta iz okvira za pretraživanjeNiz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// provjeravamo ima li okvir za pretraživanje ispravnu vrijednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parametri paketa;import org.testng.annotations.DataProvider;javna klasa DataproviderClass {@DataProvider (name = "SearchProvider")javni statički objekt [] [] getDataFromDataprovider () {vrati novi objekt [] [] {{"Guru99", "Indija"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Vrste parametara u pružatelju podataka
Metoda DataProvider podržava dvije vrste parametara.
Metoda - Ako se ISTI DataProvider ponaša drugačije s drugom metodom ispitivanja, upotrijebite parametar Method.
U sljedećem primjeru,
- Provjeravamo je li naziv metode testMethodA.
- Ako je odgovor da, vratite jedan skup vrijednosti
- Inače vraćaju drugi skup vrijednosti
parametri paketa;import java.lang.reflect.Method;import 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;javna klasa ParameterByMethodInDataprovider {Upravljački program za WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpostavljanje javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (Autor niza, String searchKey) baca InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Pretraživanje teksta u okviru za pretraživanjesearchText.sendKeys (searchKey);// Ispis autora i niza pretraživanjaSystem.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);Navoj.spavanje (3000);Niz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// Provjerite prikazuje li google tekstualni okvir točnu vrijednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")javna praznina testMethodB (String searchKey) baca InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Pretraživanje teksta u okviru za pretraživanjesearchText.sendKeys (searchKey);// Ispis samo pretraživačkog nizaSystem.out.println ("Dobrodošli -> Nepoznati korisnik Vaša tipka za pretraživanje je ->" + keyKey);Navoj.spavanje (3000);Niz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// Provjerite prikazuje li google tekstualni okvir točnu vrijednostAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Ovdje DataProvider vraća vrijednost na temelju naziva metode ispitivanja* @param m* @povratak** /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider (metoda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {vrati novi objekt [] [] {{"Guru99", "Indija"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}drugo{vrati novi objekt [] [] {{"Kanada"},{"Rusija"},{"Japan"}};}}}
Evo rezultata
ITestContext - Može se koristiti za stvaranje različitih parametara za test slučajeve na temelju grupa.
U stvarnom životu možete koristiti ITestContext za mijenjanje vrijednosti parametara na temelju Metoda ispitivanja, hostova i konfiguracija testa.
U sljedećem primjeru koda
- Imamo 2 grupe A i B
- Svaka metoda ispitivanja dodjeljuje se grupi
- Ako je vrijednost grupe A, vraća se određeni skup podataka
- Ako je vrijednost grupe B, vraća se drugi skup podataka
parametri paketa;import 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;javna klasa ParameterByITestContextInDataprovider {Upravljački program za WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupe = {"A", "B"})postavljanje javne praznine () {System.setProperty ("webdriver.gecko.driver", driverPath);upravljački program = novi FirefoxDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (Autor niza, String searchKey) baca InterruptedException {{// pretražujem google tekstualni okvirWebElement searchText = driver.findElement (By.name ("q"));// pretražujemo vrijednost na njemusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli ->" + autor + "Vaša tipka za pretraživanje je ->" + ključ pretraživanja);Navoj.spavanje (3000);Niz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// provjera ispravne vrijednosti u okviru za pretraživanjeAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")javna praznina testMethodB (String searchKey) baca InterruptedException {{// pronađi google okvir za pretraživanjeWebElement searchText = driver.findElement (By.name ("q"));// pretražujemo vrijednost na njemusearchText.sendKeys (searchKey);System.out.println ("Dobrodošli -> Nepoznati korisnik Vaša tipka za pretraživanje je ->" + keyKey);Navoj.spavanje (3000);Niz testValue = searchText.getAttribute ("vrijednost");System.out.println (testValue + ":::: + keyKey);searchText.clear ();// provjera ispravne vrijednosti u okviru za pretraživanjeAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Ovdje će DAtaProvider pružiti niz objekata na osnovi ITestContext* @param c* @povratak* /@DataProvider (name = "SearchProvider")javni objekt [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;za (Niz znakovnih grupa: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = novi objekt [] [] {{"Guru99", "Indija"},{"Krishna", "UK"},{"Bhupesh", "USA"}};pauza;}inače ako (group.equalsIgnoreCase ("B")){groupArray = novi objekt [] [] {{"Kanada"},{"Rusija"},{"Japan"}};}pauza;}povratak groupArray;}}
Napomena: Ako izravno pokrenete svoju testng klasu, prvo će pozvati pružatelja podataka koji ne može dobiti informacije o grupama jer grupe nisu dostupne. No umjesto toga ako ovu klasu nazovete putem testng.xml, ona će imati informacije o grupama dostupne s ITestContext. Upotrijebite sljedeći XML za pozivanje testa
Sažetak :
- Parametriranje je potrebno za izradu ispitivanja na temelju podataka .
- TestNG podržava dvije vrste parametrizacije, pomoću @ Parameter + TestNG.xml i pomoću @DataProvider
- U @ Parameter + TestNG.xml parametri se mogu postaviti na razinu paketa i na razinu testa. Ako
Na oba mjesta deklariran je isti naziv parametra; parametar testne razine dobit će prednost nad parametrom razine odijela.
- pomoću @ Parameter + TestNG.xml odjednom se može postaviti samo jedna vrijednost, ali @DataProvider vraća 2d niz Object .
- Ako je DataProvider prisutan u drugoj klasi, tada klasa u kojoj se nalazi ispitna metoda, DataProvider bi trebala biti statička metoda .
- Postoje dva parametra koja podržava DataProvider su Method i ITestContext.