Provider di dati & TestNG XML: parametrizzazione in selenio (esempio)

Sommario:

Anonim

Quando creiamo software, desideriamo sempre che funzioni in modo diverso con un diverso set di dati. Quando si tratta di testare lo stesso software, non possiamo essere ingiusti testarlo con un solo set di dati. Anche in questo caso, dobbiamo verificare che il nostro sistema stia prendendo tutti i set di combinazioni che dovrebbero supportare. Per questo, dobbiamo parametrizzare i nostri script di test. Ecco la parametrizzazione nella foto.

Parametrizzazione in selenio

La parametrizzazione in Selenium è un processo per parametrizzare gli script di test al fine di passare più dati all'applicazione in fase di runtime. È una strategia di esecuzione che esegue automaticamente i casi di test più volte utilizzando valori diversi. Il concetto ottenuto parametrizzando gli script di test si chiama Data Driven Testing .

In questo tutorial imparerai-

  • Tipo di parametrizzazione in TestNG-
  • Annotazione dei parametri con Testng.xml
  • Risoluzione dei problemi
  • Parametri che utilizzano Dataprovider
  • Richiama DataProvider da una classe diversa
  • Tipi di parametri in Dataprovider

Tipo di parametrizzazione in TestNG-

Per rendere più chiara la parametrizzazione, esamineremo le opzioni di parametrizzazione in uno dei framework più popolari per Selenium Webdriver - TestNG .

Ci sono due modi in cui possiamo ottenere la parametrizzazione in TestNG

  1. Con l'aiuto dell'annotazione dei parametri e del file XML TestNG .

  2. Con l'aiuto dell'annotazione DataProvider .

I parametri da Testng.xml possono essere a livello di suite o di test

Il parametro di DataProvider può accettare Method e ITestContext come parametro.

Studiamoli in dettaglio -

Annotazione dei parametri in TestNG

Parametri Annotation in TestNG è un metodo utilizzato per passare valori ai metodi di test come argomenti utilizzando il file .xml. Agli utenti potrebbe essere richiesto di passare i valori ai metodi di test durante il runtime. Il metodo di annotazione @Parameters può essere utilizzato in qualsiasi metodo con annotazione @Test, @Before, @After o @Factory.

Annotazione dei parametri con Testng.xml

Seleziona la parametrizzazione utilizzando le annotazioni quando vuoi gestire la complessità e il numero di combinazioni di input è inferiore.

Vediamo come funziona

Scenario di prova

Passaggio 1) Avvia il browser e vai su Google.com

Passaggio 2) Immettere una parola chiave di ricerca

Passaggio 3) Verificare che il valore immesso sia uguale a quello fornito dai nostri dati di test

Passaggio 4) Ripetere 2 e 3 fino a quando non vengono immessi tutti i valori

Autore del test SearchKey
Guru99 India
Krishna Stati Uniti d'America
Bhupesh Cina

Ecco un esempio di come farlo SENZA parametri

parametri del pacchetto;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";Driver WebDriver;@Testpublic void testNoParameter () genera InterructedException {String author = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Ricerca di testo nella casella di testo di GooglesearchText.sendKeys (searchKey);System.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);System.out.println ("Il thread ora dormirà");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Valore fornito da input =" + searchKey);// verifica il valore nella casella di ricerca di GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}

Uno studio, l'esempio sopra. Immagina solo quanto diventerà complesso il codice quando lo facciamo per 3 combinazioni di input

Ora, parametrizziamo questo usando TestNG

Per farlo, dovrai

  • Crea un file XML che memorizzerà i parametri
  • Nel test, aggiungi l'annotazione @Parameters

Ecco il codice completo

Livello di test TestNG.xml




File ParameterWithTestNGXML.java

parametri del pacchetto;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";Driver WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) genera InterructedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Ricerca di testo nella casella di testo di GooglesearchText.sendKeys (searchKey);System.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);System.out.println ("Il thread ora dormirà");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Valore fornito da input =" + searchKey);// verifica il valore nella casella di ricerca di GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}

Istruzioni per eseguire lo script, selezionare il file XML ed eseguire come test NG Suite

Fare clic con il tasto destro sul file .xml -> Esegui come -> Testng Suite (Nota: Suite)

Ora i parametri possono essere definiti a 2 livelli

  1. Livello suite: i parametri all'interno del tag del file XML TestNG saranno un parametro a livello di suite.
  2. Livello di test: i parametri all'interno del tag del file XML di test saranno un parametro di livello di test.

Ecco lo stesso test con parametri a livello di suite

NOTA: nel caso in cui il nome del parametro sia lo stesso a livello di suite e a livello di test, il parametro a livello di test avrà la preferenza rispetto al livello di suite. Quindi, in quel caso, tutte le classi all'interno di quel livello di test condivideranno il parametro sovrascritto e le altre classi che sono al di fuori del livello di test condivideranno il parametro a livello di suite.

Risoluzione dei problemi

Problema # 1 Il valore del parametro in testng.xml non può essere tipizzato sul parametro del metodo di test corrispondente, verrà generato un errore.

Considera il seguente esempio

Qui, l'attributo 'autore' è uguale a 'Guru99' che è una stringa e nel metodo di test corrispondente si aspetta un valore intero, quindi qui avremo un'eccezione.

Problema # 2 I tuoi @Parameters non hanno un valore corrispondente in testing.xml.

È possibile risolvere questa situazione aggiungendo l' annotazione @optional nel parametro corrispondente nel metodo di test.

Problema n. 3: si desidera testare più valori dello stesso parametro utilizzando Testng.xml

La semplice risposta è che non si può fare! Puoi avere più parametri diversi, ma ogni parametro può avere un solo valore. Questo aiuta a prevenire l'hardcoding dei valori nello script. Ciò rende il codice riutilizzabile. Consideralo come file di configurazione per il tuo script. Se si desidera utilizzare più valori per un parametro, utilizzare DataProviders

Provider di dati in TestNG

Il provider di dati in TestNG è un metodo utilizzato quando un utente deve passare parametri complessi. È necessario creare parametri complessi da Java, ad esempio oggetti complessi, oggetti da file di proprietà o da un database possono essere passati dal metodo del fornitore di dati. Il metodo è annotato da @DataProvider e restituisce un array di oggetti.

Parametri che utilizzano Dataprovider

L'annotazione @Parameters è facile ma per testare con più set di dati dobbiamo utilizzare il provider di dati.

Per riempire migliaia di moduli web utilizzando il nostro framework di test, abbiamo bisogno di una metodologia diversa che possa darci un set di dati molto grande in un unico flusso di esecuzione.

Questo concetto basato sui dati è ottenuto dall'annotazione @DataProvider in TestNG.

Ha un solo attributo "nome" . Se non si specifica l'attributo name, il nome del DataProvider sarà uguale al nome del metodo corrispondente.

Il fornitore di dati restituisce un oggetto JAVA bidimensionale al metodo di test e il metodo di test, richiamerà M volte in un tipo M * N di array di oggetti. Ad esempio, se DataProvider restituisce un array di 2 * 3 oggetti, il testcase corrispondente verrà richiamato 2 volte con 3 parametri ogni volta.

Esempio completo

parametri del pacchetto;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";@BeforeTestpublic void setup () {// Crea un oggetto driver firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Test case per verificare la casella di ricerca di Google* @param autore* @param searchKey* @throws InterructedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) genera InterructedException {{WebElement searchText = driver.findElement (By.name ("q"));// valore di ricerca nella casella di ricerca di GooglesearchText.sendKeys (searchKey);System.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);Thread.sleep (3000);String testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifica se il valore nella casella di ricerca di Google è correttoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] dove la prima colonna contiene "autore"* e la seconda colonna contiene "chiave di ricerca"* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {restituisci nuovo oggetto [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Richiama DataProvider da una classe diversa

Per impostazione predefinita, DataProvider risiede nella stessa classe in cui si trova il metodo di test o la sua classe di base. Per metterlo in qualche altra classe dobbiamo rendere il metodo del fornitore di dati come statico e nel metodo di test dobbiamo aggiungere un attributo dataProviderClass nell'annotazione @Test .

Esempio di codice

TestClass ParameterDataproviderWithClassLevel.java

parametri del pacchetto;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 {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo 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) genera InterructedException {WebElement searchText = driver.findElement (By.name ("q"));// Cerca testo nella casella di testo di GooglesearchText.sendKeys (searchKey);System.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);Thread.sleep (3000);// recupera il testo dalla casella di ricercaString testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifica se la casella di ricerca ha il valore correttoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

parametri del pacchetto;import org.testng.annotations.DataProvider;public class DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {restituisci nuovo oggetto [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Tipi di parametri in Dataprovider

Esistono due tipi di parametri supportati dal metodo DataProvider.

Metodo : se lo SAME DataProvider si comporta in modo diverso con un metodo di test diverso, utilizzare il parametro Method.

Nell'esempio seguente,

  • Controlliamo se il nome del metodo è testMethodA.
  • In caso affermativo, restituire un set di valori
  • Altrimenti restituisce un altro insieme di valori
parametri del pacchetto;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";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) genera InterructedException {WebElement searchText = driver.findElement (By.name ("q"));// Cerca testo nella casella di ricercasearchText.sendKeys (searchKey);// Stampa l'autore e la stringa di ricercaSystem.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);Thread.sleep (3000);String testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifica se la casella di testo di Google mostra il valore correttoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) genera InterructedException {{WebElement searchText = driver.findElement (By.name ("q"));// Cerca testo nella casella di ricercasearchText.sendKeys (searchKey);// Stampa solo la stringa di ricercaSystem.out.println ("Benvenuto -> Utente sconosciuto La tua chiave di ricerca è ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifica se la casella di testo di Google mostra il valore correttoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Qui DataProvider restituisce il valore sulla base del nome del metodo di test* @param m* @ritorno** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (metodo m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {restituisci nuovo oggetto [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}altro{restituisci nuovo oggetto [] [] {{"Canada"},{"Russia"},{"Giappone"}};}}}

Ecco l'output

ITestContext : può essere utilizzato per creare parametri diversi per casi di test basati su gruppi.

Nella vita reale, è possibile utilizzare ITestContext per variare i valori dei parametri in base a metodi di test, host, configurazioni del test.

Nell'esempio di codice seguente

  • Abbiamo 2 gruppi A e B
  • Ogni metodo di prova è assegnato a un gruppo
  • Se il valore del gruppo è A, viene restituito un determinato set di dati
  • Se il valore del gruppo è B, viene restituito un altro set di dati
parametri del pacchetto;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 (gruppi = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo 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) genera InterructedException {{// cerca nella casella di testo di GoogleWebElement searchText = driver.findElement (By.name ("q"));// cerca un valore su di essosearchText.sendKeys (searchKey);System.out.println ("Benvenuto ->" + autore + "La tua chiave di ricerca è ->" + chiave di ricerca);Thread.sleep (3000);String testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifica il valore corretto nella casella di ricercaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) genera InterructedException {{// trova la casella di ricerca di GoogleWebElement searchText = driver.findElement (By.name ("q"));// cerca un valore su di essosearchText.sendKeys (searchKey);System.out.println ("Benvenuto -> Utente sconosciuto La tua chiave di ricerca è ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("value");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifica il valore corretto nella casella di ricercaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Qui il DAtaProvider fornirà l'array di oggetti sulla base di ITestContext* @param c* @ritorno* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;for (String group: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nuovo oggetto [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};rompere;}altrimenti if (group.equalsIgnoreCase ("B")){groupArray = nuovo oggetto [] [] {{"Canada"},{"Russia"},{"Giappone"}};}rompere;}return groupArray;}}

Nota: se esegui direttamente la tua classe testng, chiamerà prima il provider di dati che non può ottenere informazioni sui gruppi poiché i gruppi non sono disponibili. Ma invece se chiami questa classe tramite testng.xml, le informazioni sui gruppi saranno disponibili con ITestContext. Usa il seguente XML per chiamare il test

Riepilogo :

  • La parametrizzazione è necessaria per creare test basati sui dati .
  • TestNG supporta due tipi di parametrizzazione, utilizzando @ Parameter + TestNG.xml e utilizzando @DataProvider
  • In @ Parameter + TestNG.xml i parametri possono essere inseriti a livello di suite e di test. Se

    Lo stesso nome di parametro viene dichiarato in entrambe le posizioni; il parametro del livello di test avrà la preferenza sul parametro del livello della tuta.

  • utilizzando @ Parameter + TestNG.xml è possibile impostare un solo valore alla volta, ma @DataProvider restituisce un array 2d di Object .
  • Se DataProvider è presente nella classe diversa, la classe in cui risiede il metodo di test, DataProvider dovrebbe essere un metodo statico .
  • Ci sono due parametri supportati da DataProvider sono Method e ITestContext.