Furnizor de date și TestNG XML: parametrizare în Selenium(Exemplu)
Parametrizare în Selenium
Parametrizare în Selenium este un proces de parametrizare a scripturilor de testare pentru a transmite mai multe date aplicației în timpul execuției. Este o strategie de execuție care rulează automat cazuri de testare de mai multe ori folosind valori diferite. Conceptul realizat prin parametrizarea scripturilor de testare este numit Testare bazată pe date.
Tipul de parametrizare în TestNG-
Pentru a face parametrizarea mai clară, vom parcurge opțiunile de parametrizare într-unul dintre cele mai populare cadru pentru Selenium Webdriver – TestNG.
Sunt doua feluri prin care putem realiza parametrizarea în TestNG
Parametrii din Testng.xml pot fi la nivel de suită sau de test
Parametrul de la DataProvider poate lua Method și ITestContext ca parametru.
Să le studiem în detaliu -
Parametri Adnotare în TestNG
Parametri Adnotare în TestNG este o metodă folosită pentru a transmite valori metodelor de testare ca argumente folosind fișierul .xml. Utilizatorilor li se poate cere să transmită valorile metodelor de testare în timpul rulării. Metoda de adnotare @Parameters poate fi utilizată în orice metodă care are @Test, @Before, @After sau @Factory.
Adnotarea parametrilor cu Testng.xml
Selectați parametrizarea folosind adnotări atunci când doriți să vă ocupați de complexitate și numărul de combinații de intrare este mai mic.
Să vedem cum funcționează
Scenariu de testare
Pasul 1) Lansați browserul și accesați Google.com
Pasul 2) Introduceți un cuvânt cheie de căutare
Pasul 3) Verificați că valoarea introdusă este aceeași cu cea furnizată de datele noastre de testare
Pasul 4) Repetați 2 și 3 până când sunt introduse toate valorile
Autorul testului | Tasta de căutare |
---|---|
Guru99 | India |
Krishna | USA |
Bhupesh | China |
Iată un exemplu despre cum să o faci FĂRĂ parametri
package parameters; import org.testng.annotations.Test; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class NoParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test public void testNoParameter() throws InterruptedException{ String author = "guru99"; String searchKey = "india"; System.setProperty("webdriver.gecko.driver", driverPath); driver= new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Un studiu, exemplul de mai sus. Imaginează-ți cât de complex va deveni codul când facem asta pentru 3 combinații de intrare
Acum, să parametrizăm acest lucru folosind TestNG
Pentru a face acest lucru, va trebui
- Creați un fișier XML care va stoca parametrii
-
În test, adăugați adnotarea @Parameters
Aici este codul complet
Nivelul testului TestNG.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="TestSuite" thread-count="3" > <parameter name="author" value="Guru99" /> <parameter name="searchKey" value="India" /> <test name="testGuru"> <parameter name="searchKey" value="UK" /> <classes> <class name="parameters.ParameterWithTestNGXML"> </class> </classes> </test> </suite>
ParameterWithTestNGFișier XML.java
package parameters; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import 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; public class ParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test @Parameters({"author","searchKey"}) public void testParameterWithXML( @Optional("Abc") String author,String searchKey) throws InterruptedException{ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Instrucțiuni pentru a rula scriptul, selectați fișierul XML și Run as Test NG Suite
Faceți clic dreapta pe fișierul .xml -> Run as -> Testng Suită (Notă: Suită)
Acum, parametrii pot fi definiți la 2 niveluri
- Nivel de suită – Parametrii din interiorul eticheta de TestNG Fișierul XML va fi un parametru la nivel de suită.
- Nivel de testare — Parametrii din interiorul eticheta fișierului XML de testare va fi un parametru de nivel de testare.
Iată același test cu parametrii la nivel de suită
NOTĂ: În cazul în care numele parametrului este același la nivel de suită și la nivelul de test, atunci parametrul de nivel de test va primi preferință față de nivelul de suită. Deci, în acest caz, toate clasele din acel nivel de test vor împărtăși parametrul suprascris, iar alte clase care se află în afara nivelului de test vor împărtăși parametrul la nivel de suită.
Depanare
Emisiune # 1 Valoarea parametrului din testng.xml nu poate fi transformată în parametrul metodei de testare corespunzătoare, aceasta va genera o eroare.
Luați în considerare următorul exemplu
Aici, atributul „autor” este egal cu „Guru99”, care este un șir, iar în metoda de testare corespunzătoare se așteaptă o valoare întreagă, așa că vom obține o excepție aici.
Emisiune # 2 @Parameters dvs. nu au o valoare corespunzătoare în testing.xml.
Puteți rezolva această situație adăugând @optional adnotare în parametrul corespunzător din metoda de testare.
Problema # 3: Doriți să testați mai multe valori ale aceluiași parametru folosind Testng.xml
Răspunsul simplu este că acest lucru nu se poate face! Puteți avea mai mulți parametri diferiți, dar fiecare parametru poate avea o singură valoare. Acest lucru ajută la prevenirea codării hardcodării valorilor în script. Acest lucru face codul reutilizabil. Gândiți-vă la el ca fișiere de configurare pentru scriptul dvs. Dacă doriți să utilizați mai multe valori pentru un parametru, utilizați DataProviders
Furnizor de date în TestNG
Furnizor de date în TestNG este o metodă folosită atunci când un utilizator trebuie să treacă parametri complecși. Parametrii complexi trebuie să fie creați din Java precum obiectele complexe, obiectele din fișierele de proprietate sau dintr-o bază de date pot fi transmise prin metoda furnizorului de date. Metoda este adnotată de @DataProvider și returnează o matrice de obiecte.
Parametri folosind Dataprovider
Adnotarea @Parameters este ușoară, dar pentru a testa cu mai multe seturi de date trebuie să folosim Data Provider.
Pentru a completa mii de formulare web folosind cadrul nostru de testare, avem nevoie de o metodologie diferită care ne poate oferi un set de date foarte mare într-un singur flux de execuție.
Acest concept bazat pe date este realizat prin @DataProvider adnotare în TestNG.
Are doar unul Numele atributului'. Dacă nu specificați atributul nume, atunci numele DataProvider va fi același cu numele metodei corespunzătoare.
Furnizorul de date revine un obiect JAVA bidimensional la metoda de testare și la metoda de testare, va invoca de M ori într-o matrice de obiecte de tip M*N. De exemplu, dacă DataProvider returnează o matrice de 2*3 obiecte, cazul de testare corespunzător va fi invocat de 2 ori cu 3 parametri de fiecare dată.
Exemplu complet
package parameters; import java.util.concurrent.TimeUnit; import 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; public class ParameterByDataprovider { WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ //Create firefox driver object System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } /** Test case to verify google search box * @param author * @param searchKey * @throws InterruptedException */ @Test(dataProvider="SearchProvider") public void testMethod(String author,String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //search value in google searchbox searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if the value in google search box is correct Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * @return Object[][] where first column contains 'author' * and second column contains 'searchKey' */ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; } }
Invocați DataProvider din clasă diferită
În mod implicit, DataProvider rezidă în aceeași clasă în care este metoda de testare sau în clasa sa de bază. Pentru a o pune într-o altă clasă, trebuie să facem ca metoda furnizorului de date să fie statică, iar în metoda de testare trebuie să adăugăm un atribut dataProviderClass in @Test adnotare.
Exemplu de cod
TestClass ParameterDataproviderWithClassLevel.java
package parameters; import java.util.concurrent.TimeUnit; import 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",dataProviderClass=DataproviderClass.class) public void testMethod(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); //get text from search box String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify if search box has correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } }
DataproviderClass.java
package parameters; import org.testng.annotations.DataProvider; public class DataproviderClass { @DataProvider(name="SearchProvider") public static Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; }}
Tipuri de parametri în Dataprovider
Există două tipuri de parametri acceptați de metoda DataProvider.
Metodă- Dacă LA FEL DataProvider ar trebui să se comporte diferit cu o metodă de testare diferită, utilizați parametrul Method.
În exemplul următor,
- Verificăm dacă numele metodei este testMethodA.
- Dacă da, returnați un set de valori
- Altfel returnează un alt set de valori
package parameters; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; import 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; public class ParameterByMethodInDataprovider{ WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider") public void testMethodA(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print author and search string System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } @Test(dataProvider="SearchProvider") public void testMethodB(String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print only search string System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here DataProvider returning value on the basis of test method name * @param m * @return **/ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(Method m){ if(m.getName().equalsIgnoreCase("testMethodA")){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } };} else{ return new Object[][] { { "Canada" }, { "Russia" }, { "Japan" } };} } }
Aici este rezultatul
ITestContext– Se poate folosi pentru a crea diferiți parametri pentru cazurile de testare bazate pe grupuri.
În viața reală, puteți utiliza ITestContext pentru a varia valorile parametrilor în funcție de metodele de testare, gazde, configurații ale testului.
În următorul exemplu de cod
- Avem 2 grupe A & B
- Fiecare metodă de testare este atribuită unui grup
- Dacă valoarea grupului este A, este returnat un anumit set de date
- Dacă valoarea grupului este B, este returnat un alt set de date
package parameters; import java.util.concurrent.TimeUnit; import 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest(groups={"A","B"}) public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",groups="A") public void testMethodA(String author,String searchKey) throws InterruptedException{ { //search google textbox WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } @Test(dataProvider="SearchProvider",groups="B") public void testMethodB(String searchKey) throws InterruptedException{ { //find google search box WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here the DAtaProvider will provide Object array on the basis on ITestContext * @param c * @return */ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(ITestContext c){ Object[][] groupArray = null; for (String group : c.getIncludedGroups()) { if(group.equalsIgnoreCase("A")){ groupArray = new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; break; } else if(group.equalsIgnoreCase("B")) { groupArray = new Object[][] { { "Canada" }, { "Russia" }, { "Japan" } }; } break; } return groupArray; } }
Notă: Dacă rulați direct clasa de testare, va apela mai întâi furnizorul de date care nu poate obține informații despre grupuri, deoarece grupurile nu sunt disponibile. Dar, în schimb, dacă apelați această clasă prin testng.xml, va avea informații despre grupuri disponibile cu ITestContext. Utilizați următorul XML pentru a apela testul
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > <suite name="test-parameter"> <test name="example1"> <groups> <run> <include name="A" /> </run> </groups> <classes> <class name="parameters.ParameterByITestContextInDataprovider" /> </classes> </test> <test name="example2"> <groups> <run> <include name="B" /> </run> </groups> <classes> <class name="parameters.ParameterByITestContextInDataprovider" /> </classes> </test> </suite>
Rezumat
- Parametrizare este necesar pentru a crea Testare bazată pe date.
- TestNG suportă două tipuri de parametrizare, folosind @Parametru+TestNG.xml și utilizarea@DataProvider
-
In @Parametru+TestNG.xml parametrii pot fi plasați la nivel de suită și la nivel de test. Dacă
Același nume de parametru este declarat în ambele locuri; parametrul de nivel de testare va primi preferință față de parametrul de nivel de costum.
- folosind @Parameter+TestNG.xml poate fi setată o singură valoare la un moment dat, dar @DataProvider revine o matrice 2d de Object.
- Dacă DataProvider este prezent în altă clasă, atunci clasa în care se află metoda de testare,Furnizor de date ar trebui să fie metoda statică.
- Există doi parametri acceptați de Furnizor de date sunt Metodă si ITestContext.