Furnizor de date & TestNG XML: Parametrizare în seleniu (exemplu)

Cuprins:

Anonim

Pe măsură ce creăm software, ne dorim întotdeauna să funcționeze diferit cu un set diferit de date. Când vine vorba de testarea aceleiași aplicații software, nu putem fi nedrept să îl testăm cu un singur set de date. Din nou, trebuie să verificăm dacă sistemul nostru ia toate seturile de combinații pe care se așteaptă să le accepte. Pentru aceasta, trebuie să ne parametrizăm fragmentele de test. Aici apare Parametrizarea în imagine.

Parametrizarea în seleniu

Parametrizarea în Selenium este un proces de parametrizare a scripturilor de testare pentru a transmite mai multe date aplicației în timpul rulării. Este o strategie de execuție care rulează automat cazuri de test de mai multe ori folosind valori diferite. Conceptul realizat prin parametrizarea scripturilor de testare se numește Testare bazată pe date .

În acest tutorial, veți învăța-

  • Tipul parametrării în TestNG-
  • Adnotarea parametrilor cu Testng.xml
  • Depanare
  • Parametrii folosind Dataprovider
  • Invocați DataProvider din diferite clase
  • Tipuri de parametri în Dataprovider

Tipul parametrării în TestNG-

Pentru a face parametrarea mai clară, vom parcurge opțiunile de parametrizare într-unul dintre cele mai populare cadre pentru Selenium Webdriver - TestNG .

Există două moduri prin care putem realiza parametrizarea în TestNG

  1. Cu ajutorul adnotării parametrilor și a fișierului XML TestNG .

  2. Cu ajutorul adnotării DataProvider .

Parametrii din Testng.xml pot fi suite sau nivel de test

Parametrul din DataProvider poate lua Method și ITestContext ca parametru.

Să le studiem în detaliu -

Adnotarea parametrilor în TestNG

Adnotarea parametrilor în TestNG este o metodă utilizată 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ă având adnotare @Test, @Before, @After sau @Factory.

Adnotarea parametrilor cu Testng.xml

Selectați parametrizarea folosind adnotări atunci când doriți să faceți față complexității și numărul de combinații de intrare este mai mic.

Să vedem cum funcționează acest lucru

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 dacă valoarea introdusă este aceeași cu cea furnizată de datele noastre de testare

Pasul 4) Repetați 2 și 3 până când toate valorile sunt introduse

Autor de testare Căutare cheie
Guru99 India
Krishna Statele Unite ale Americii
Bhupesh China

Iată un exemplu de cum se face fără parametri

parametrii pachetului;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;clasa publică NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Driver WebDriver;@Testpublic void testNoParameter () aruncă InterruptedException {Autor șir = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);WebElement searchText = driver.findElement (By.name ("q"));// Căutarea textului în caseta de text GooglesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);System.out.println ("Firul va dormi acum");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Value given by input =" + searchKey);// verificarea valorii în caseta de căutare GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valoare"). EqualsIgnoreCase (searchKey));}}

Un studiu, exemplul de mai sus. Imaginați-vă cât de complex va deveni codul atunci când facem acest lucru 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 adnotare @ Parametri

Iată codul complet

Nivel de testare TestNG.xml




Fișier ParameterWithTestNGXML.java

parametrii pachetului;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;clasă publică ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Driver WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Autor șir, String searchKey) aruncă InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);WebElement searchText = driver.findElement (By.name ("q"));// Căutarea textului în caseta de text GooglesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);System.out.println ("Firul va dormi acum");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Value given by input =" + searchKey);// verificarea valorii în caseta de căutare GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valoare"). EqualsIgnoreCase (searchKey));}}

Instrucțiuni pentru a rula scriptul, selectați fișierul XML și Rulați ca Test NG Suite

Faceți clic dreapta pe fișierul .xml -> Run as -> Testng Suite (Notă: Suite)

Acum, parametrii pot fi definiți la 2 niveluri

  1. Nivel de suită - Parametrii din eticheta a fișierului XML TestNG vor fi un parametru de nivel de suită.
  2. Nivel de testare - Parametrii din eticheta a fișierului XML de testare vor 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 nivel de test, atunci parametrul de nivel de testare va primi preferință față de nivelul suitei. Deci, în acest caz, toate clasele din interiorul acelui nivel de test vor partaja parametrul suprascris, iar alte clase care se află în afara nivelului de testare vor partaja parametrul de nivel al suitei.

Depanare

Problema # 1 Valoarea parametrului din testng.xml nu poate fi tipărită la parametrul metodei de testare corespunzătoare, va genera o eroare.

Luați în considerare următorul exemplu

Aici, atributul „autor” este egal cu „Guru99”, care este un șir și în metoda de test corespunzătoare se așteaptă o valoare întreagă, deci vom obține o excepție aici.

Problema # 2 @Parameters dvs. nu au o valoare corespunzătoare în testing.xml.

Puteți rezolva această situație adăugând adnotare @opțională î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 doar o singură valoare. Acest lucru ajută la prevenirea valorilor hardcoding în script. Acest lucru face codul reutilizabil. Gândiți-vă la asta ca la 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

Furnizorul de date în TestNG este o metodă utilizată atunci când un utilizator trebuie să treacă parametri complexi. Parametrii complexi trebuie să fie creați din Java, cum ar fi obiectele complexe, obiectele din fișierele de proprietăți sau dintr-o bază de date pot fi transmise prin metoda furnizorului de date. Metoda este adnotată de @DataProvider și returnează o serie de obiecte.

Parametrii folosind Dataprovider

Adnotarea @Parameters este ușoară, dar pentru a testa cu mai multe seturi de date trebuie să folosim Furnizor de date.

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 adnotarea @DataProvider în TestNG.

Are un singur atribut „nume” . Dacă nu specificați atributul nume, atunci numele furnizorului de date va fi același cu numele metodei corespunzătoare.

Furnizorul de date returnează un obiect JAVA bidimensional la metoda de testare și metoda de testare, va invoca M ori într-un tip de matrice de obiecte 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

parametrii pachetului;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 {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestconfigurare public nul () {// Creați obiectul driverului FirefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);}/ ** Caz de testare pentru a verifica caseta de căutare Google* @param autor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (autor String, String searchKey) aruncă InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// valoarea căutării în căutarea GooglesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verificați dacă valoarea din caseta de căutare Google este corectăAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] unde prima coloană conține „autor”* și a doua coloană conține „searchKey”* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {returnează noul obiect [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "SUA"}};}}

Invocați DataProvider din diferite clase

În mod implicit, DataProvider se află în aceeași clasă în care se află metoda de testare sau clasa sa de bază. Pentru a- l pune într - o altă clasă de care avem nevoie pentru a face metoda ca furnizor de date statice și în metoda de testare trebuie să adăugați un atribut dataProviderClass în @Test adnotată.

Exemplu de cod

TestClass ParameterDataproviderWithClassLevel.java

parametrii pachetului;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;clasă publică ParameterDataproviderWithClassLevel {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestconfigurare public nul () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (autor String, String searchKey) aruncă InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Căutați text în caseta de text GooglesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);// obțineți text din caseta de căutareString testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verificați dacă caseta de căutare are valoarea corectăAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

parametrii pachetului;import org.testng.annotations.DataProvider;clasă publică DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {returnează noul obiect [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "SUA"}};}}

Tipuri de parametri în Dataprovider

Există două tipuri de parametri suportați de metoda DataProvider.

Metodă - Dacă SAME 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, returnează un set de valori
  • Altfel returnează un alt set de valori
parametrii pachetului;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 {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestconfigurare public nul () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) aruncă InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Căutați text în caseta de căutaresearchText.sendKeys (searchKey);// Imprimați autorul și șirul de căutareSystem.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verificați dacă caseta de text Google arată valoarea corectăAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) aruncă InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Căutați text în caseta de căutaresearchText.sendKeys (searchKey);// Imprimați doar șir de căutareSystem.out.println ("Bun venit -> Utilizator necunoscut Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verificați dacă caseta de text Google arată valoarea corectăAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aici DataProvider returnează valoarea pe baza numelui metodei de testare* @param m* @întoarcere** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Metoda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {returnează noul obiect [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "SUA"}};}altceva {returnează noul obiect [] [] {{"Canada"},{"Rusia"},{ "Japonia" }};}}}

Iată rezultatul

ITestContext - Poate fi folosit pentru a crea parametri diferiți pentru cazurile de test pe baza grupurilor.

În viața reală, puteți utiliza ITestContext pentru a varia valorile parametrilor pe baza metodelor de testare, a gazdelor, a configurațiilor testului.

În următorul exemplu de cod

  • Avem 2 grupuri A & B
  • Fiecare metodă de testare este alocată unui grup
  • Dacă valoarea grupului este A, se returnează un anumit set de date
  • Dacă valoarea grupului este B, se returnează un alt set de date
parametrii pachetului;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 {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupuri = {"A", "B"})configurare public nul () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nou FirefoxDriver ();driver.manage (). timeouts (). implicit Așteptați (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider", grupuri = "A")public void testMethodA (String author, String searchKey) aruncă InterruptedException {{// căutați caseta text GoogleWebElement searchText = driver.findElement (By.name ("q"));// căutați o valoare pe easearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + autor + "Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verificați valoarea corectă în căsuța de căutareAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", grupuri = "B")public void testMethodB (String searchKey) aruncă InterruptedException {{// găsiți caseta de căutare googleWebElement searchText = driver.findElement (By.name ("q"));// căutați o valoare pe easearchText.sendKeys (searchKey);System.out.println ("Bun venit -> Utilizator necunoscut Cheia dvs. de căutare este ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valoare");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verificați valoarea corectă în căsuța de căutareAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aici DAtaProvider va furniza matrice de obiecte pe baza ITestContext* @param c* @întoarcere* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Obiect [] [] groupArray = nul;pentru (Grup de șiruri: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = obiect nou [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "SUA"}};pauză;}else if (group.equalsIgnoreCase ("B")){groupArray = obiect nou [] [] {{"Canada"},{"Rusia"},{ "Japonia" }};}pauză;}return groupArray;}}

Notă: Dacă rulați direct cursul testng, acesta 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

Rezumat :

  • Parametrizarea este necesară pentru a crea testare bazată pe date .
  • TestNG acceptă două tipuri de parametrizare, utilizând @ Parameter + TestNG.xml și folosind @DataProvider
  • În @ Parameter + 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 se poate seta o singură valoare la un moment dat, dar @DataProvider returnează o matrice 2d de Object .
  • Dacă DataProvider este prezent în diferite clase, atunci clasa în care se află metoda de testare, DataProvider ar trebui să fie metodă statică .
  • Există doi parametri suportați de DataProvider : Method și ITestContext.