Dataprovider & TestNG XML: Parametrizace v selenu (příklad)

Obsah:

Anonim

Když vytváříme software, vždy si přejeme, aby fungoval jinak s jinou sadou dat. Pokud jde o testování stejného softwaru, nemůžeme být nefér testovat ho pouze s jednou sadou dat. Tady opět musíme ověřit, že náš systém přijímá všechny sady kombinací, u nichž se očekává, že budou podporovat. K tomu potřebujeme parametrizovat naše testovací scipty. Na obrázku je parametrizace.

Parametrizace v selenu

Parametrizace v selenu je proces parametrizace testovacích skriptů za účelem předání více dat do aplikace za běhu. Jedná se o strategii provádění, která automaticky spouští testovací případy několikrát s použitím různých hodnot. Koncept dosažený parametrizací testovacích skriptů se nazývá Data Driven Testing .

V tomto výukovém programu se naučíte

  • Typ parametrizace v TestNG-
  • Anotace parametrů s Testng.xml
  • Odstraňování problémů
  • Parametry využívající Dataprovider
  • Vyvolejte DataProvider z jiné třídy
  • Typy parametrů v Dataprovider

Typ parametrizace v TestNG-

Aby byla parametrizace jasnější, projdeme možnosti parametrizace v jednom z nejpopulárnějších frameworků pro Selenium Webdriver - TestNG .

Existují dva způsoby, jak můžeme dosáhnout parametrizace v TestNG

  1. S pomocí anotace parametrů a souboru XML TestNG .

  2. S pomocí anotace DataProvider .

Parametry z Testng.xml mohou být na úrovni sady nebo na úrovni testu

Parametr z DataProvider může jako parametr použít Method a ITestContext.

Pojďme si je podrobně prostudovat -

Anotace parametrů v TestNG

Anotace parametrů v TestNG je metoda používaná k předávání hodnot testovacím metodám jako argumenty pomocí souboru .xml. Uživatelé mohou být požádáni, aby předali hodnoty testovacím metodám za běhu. Metodu anotace @Parameters lze použít v jakékoli metodě s anotací @Test, @Before, @After nebo @Factory.

Anotace parametrů s Testng.xml

Chcete-li se vypořádat se složitostí a počtem vstupních kombinací je méně, vyberte parametrizaci pomocí anotací.

Podívejme se, jak to funguje

Scénář testu

Krok 1) Spusťte prohlížeč a přejděte na Google.com

Krok 2) Zadejte klíčové slovo pro vyhledávání

Krok 3) Ověřte, zda je zadaná hodnota stejná jako hodnota poskytovaná našimi testovacími údaji

Krok 4) Opakujte 2 a 3, dokud nezadáte všechny hodnoty

Autor zkoušky SearchKey
Guru99 Indie
Krišna USA
Bhupesh Čína

Zde je příklad toho, jak to udělat BEZ parametrů

parametry balíčku;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;veřejná třída NoParameterWithTestNGXML {Řetězec driverPath = "C: \\ geckodriver.exe";Ovladač WebDriver;@Testpublic void testNoParameter () vyvolá InterruptedException {Autor řetězce = "guru99";Řetězec 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"));// Hledání textu v textovém poli googlesearchText.sendKeys (searchKey);System.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);System.out.println ("Vlákno nyní usne");Závit. Spánek (3000);System.out.println ("Hodnota ve vyhledávacím poli Google =" + searchText.getAttribute ("hodnota") + "::: Hodnota zadaná input =" + searchKey);// ověření hodnoty ve vyhledávacím poli GoogleAssertJUnit.assertTrue (searchText.getAttribute ("hodnota"). EqualsIgnoreCase (searchKey));}}

Studie, výše uvedený příklad. Jen si představte, jak složitý bude kód, když to uděláme pro 3 vstupní kombinace

Pojďme to nyní parametrizovat pomocí TestNG

K tomu budete muset

  • Vytvořte soubor XML, který uloží parametry
  • V testu přidejte anotaci @Parameters

Zde je kompletní kód

Úroveň testu TestNG.xml




Soubor ParameterWithTestNGXML.java

parametry balíčku;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;veřejná třída ParameterWithTestNGXML {Řetězec driverPath = "C: \\ geckodriver.exe";Ovladač WebDriver;@Test@Parameters ({"autor", "searchKey"})public void testParameterWithXML (@Optional ("Abc") autor řetězce, řetězec searchKey) vyvolá 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"));// Hledání textu v textovém poli googlesearchText.sendKeys (searchKey);System.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);System.out.println ("Vlákno nyní usne");Závit. Spánek (3000);System.out.println ("Hodnota ve vyhledávacím poli Google =" + searchText.getAttribute ("hodnota") + "::: Hodnota zadaná input =" + searchKey);// ověření hodnoty ve vyhledávacím poli GoogleAssertJUnit.assertTrue (searchText.getAttribute ("hodnota"). EqualsIgnoreCase (searchKey));}}

Pokyny ke spuštění skriptu, vyberte soubor XML a Spustit jako test NG Suite

Klikněte pravým tlačítkem na soubor .xml -> Spustit jako -> Testng Suite (Poznámka: Suite)

Nyní lze parametry definovat na 2 úrovních

  1. Úroveň sady - Parametry uvnitř značky souboru XML TestNG budou parametrem úrovně sady.
  2. Úroveň testu - Parametry uvnitř značky testovacího souboru XML budou parametrem úrovně testu.

Tady je stejný test s parametry na úrovni sady

POZNÁMKA: V případě, že je název parametru stejný na úrovni sady i na úrovni testu, bude mít parametr úrovně testu přednost před úrovní sady. V takovém případě budou všechny třídy uvnitř této testovací úrovně sdílet přepsaný parametr a ostatní třídy, které jsou mimo testovací úroveň, budou sdílet parametr na úrovni sady.

Odstraňování problémů

Problém číslo 1 Hodnotu parametru v testng.xml nelze přetypovat na parametr příslušné testovací metody, vyvolá chybu.

Zvažte následující příklad

Atribut 'author' se zde rovná 'Guru99', což je řetězec a v příslušné testovací metodě očekává celočíselnou hodnotu, takže zde dostaneme výjimku.

Problém # 2 Vaše @Parameters nemají odpovídající hodnotu v testing.xml.

Tuto situaci můžete vyřešit přidáním @optional anotace do odpovídajícího parametru v testovací metodě.

Problém č. 3: Chcete otestovat více hodnot stejného parametru pomocí Testng.xml

Jednoduchá odpověď je, že to nelze provést! Můžete mít několik různých parametrů, ale každý parametr může mít pouze jednu hodnotu. To pomáhá zabránit tomu, aby do kódu byly pevně zakódovány hodnoty. Díky tomu je kód znovu použitelný. Představte si to jako konfigurační soubory skriptu. Pokud chcete pro parametr použít více hodnot, použijte DataProviders

Poskytovatel dat v TestNG

Poskytovatel dat v TestNG je metoda používaná, když uživatel potřebuje předat složité parametry. Složité parametry je třeba vytvořit z prostředí Java, například složité objekty, objekty ze souborů vlastností nebo z databáze lze předat metodou poskytovatele dat. Metoda je anotována @DataProvider a vrací pole objektů.

Parametry využívající Dataprovider

@Parameters anotace je snadná, ale k otestování s více sadami dat musíme použít poskytovatele dat.

Abychom vyplnili tisíce webových formulářů pomocí našeho testovacího rámce, potřebujeme jinou metodiku, která nám může poskytnout velmi velkou datovou sadu v jediném toku provádění.

Tato data řízený koncept je dosaženo @DataProvider anotace TestNG.

Má pouze jeden atribut „name“ . Pokud nezadáte atribut name, bude název DataProvider stejný jako název odpovídající metody.

Poskytovatel dat vrací dvourozměrný objekt JAVA do testovací metody a testovací metoda, vyvolá M krát v poli objektu typu M * N. Například pokud DataProvider vrátí pole 2 * 3 objektů, bude odpovídající testcase vyvolán 2krát se 3 parametry pokaždé.

Kompletní příklad

parametry balíčku;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;veřejná třída ParameterByDataprovider {Ovladač WebDriver;Řetězec driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Vytvořit objekt ovladače firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Testovací případ k ověření vyhledávacího pole Google* @param autor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (autor řetězce, řetězec searchKey) vyvolá InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// hodnota hledání ve vyhledávacím poli GooglesearchText.sendKeys (searchKey);System.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);Řetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Ověřte, zda je hodnota ve vyhledávacím poli Google správnáAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], kde první sloupec obsahuje „autora“* a druhý sloupec obsahuje 'searchKey'* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {vrátit nový objekt [] []{{"Guru99", "Indie"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Vyvolejte DataProvider z jiné třídy

Ve výchozím nastavení je DataProvider umístěn ve stejné třídě, kde je testovací metoda nebo její základní třída. Abychom to dali do nějaké jiné třídy, musíme udělat metodu poskytovatele dat jako statickou a v testovací metodě musíme přidat atribut dataProviderClass do poznámky @Test .

Příklad kódu

TestClass ParameterDataproviderWithClassLevel.java

parametry balíčku;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;veřejná třída ParameterDataproviderWithClassLevel {Ovladač WebDriver;Řetězec driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic 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 (autor řetězce, řetězec searchKey) vyvolá InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Hledání textu v textovém poli googlesearchText.sendKeys (searchKey);System.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);// získání textu z vyhledávacího poleŘetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// ověří, zda má vyhledávací pole správnou hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

parametry balíčku;import org.testng.annotations.DataProvider;veřejná třída DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {vrátit nový objekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Typy parametrů v Dataprovider

Metoda DataProvider podporuje dva typy parametrů.

Metoda - Pokud by se měl SAME DataProvider chovat odlišně s jinou testovací metodou, použijte parametr Metoda.

V následujícím příkladu

  • Zkontrolujeme, zda je název metody testMethodA.
  • Pokud ano, vraťte jednu sadu hodnot
  • Jinak vraťte další sadu hodnot
parametry balíčku;importovat 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;veřejná třída ParameterByMethodInDataprovider {Ovladač WebDriver;Řetězec driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic 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 (autor řetězce, řetězec searchKey) vyvolá InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Hledat text ve vyhledávacím polisearchText.sendKeys (searchKey);// Vytisknout autora a hledaný řetězecSystem.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);Řetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Ověřte, zda textové pole google zobrazuje správnou hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) vyvolá InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Hledat text ve vyhledávacím polisearchText.sendKeys (searchKey);// Tiskne pouze hledaný řetězecSystem.out.println ("Vítejte -> Neznámý uživatel Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);Řetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Ověřte, zda textové pole google zobrazuje správnou hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Zde DataProvider vrací hodnotu na základě názvu testovací metody* @param m* @vrátit se** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (metoda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {vrátit nový objekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}jiný{vrátit nový objekt [] [] {{"Kanada"},{"Rusko"},{"Japonsko"}};}}}

Tady je výstup

ITestContext - Může se použít k vytvoření různých parametrů pro testovací případy na základě skupin.

V reálném životě můžete použít ITestContext ke změně hodnot parametrů na základě testovacích metod, hostitelů, konfigurací testu.

V následujícím příkladu kódu

  • Máme 2 skupiny A & B.
  • Každá zkušební metoda je přiřazena ke skupině
  • Pokud je hodnota skupiny A, vrátí se konkrétní datová sada
  • Pokud je hodnota skupiny B, je vrácena další sada dat
parametry balíčku;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;veřejná třída ParameterByITestContextInDataprovider {Ovladač WebDriver;Řetězec 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 (autor řetězce, řetězec searchKey) vyvolá InterruptedException {{// prohledat textové pole googleWebElement searchText = driver.findElement (By.name ("q"));// vyhledá na něm hodnotusearchText.sendKeys (searchKey);System.out.println ("Vítejte ->" + autor + "Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);Řetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// ověřte správnou hodnotu ve vyhledávacím poliAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) vyvolá InterruptedException {{// najít vyhledávací pole GoogleWebElement searchText = driver.findElement (By.name ("q"));// vyhledá na něm hodnotusearchText.sendKeys (searchKey);System.out.println ("Vítejte -> Neznámý uživatel Váš vyhledávací klíč je ->" + searchKey);Závit. Spánek (3000);Řetězec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// ověřte správnou hodnotu ve vyhledávacím poliAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Zde poskytne DAtaProvider pole Object na základě ITestContext* @param c* @vrátit se* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;pro (Skupina řetězců: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nový objekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{"Bhupesh", "USA"}};přestávka;}else if (group.equalsIgnoreCase ("B")){groupArray = nový objekt [] [] {{"Kanada"},{"Rusko"},{"Japonsko"}};}přestávka;}návrat groupArray;}}

Poznámka: Pokud přímo spustíte svou třídu testng, nejprve zavolá dataprovider, který nemůže získat informace o skupinách, protože skupiny nejsou k dispozici. Ale místo toho, pokud tuto třídu zavoláte přes testng.xml, bude mít k dispozici informace o skupinách s ITestContext. K volání testu použijte následující XML

Shrnutí :

  • Parametrizace je nutná pro vytvoření testování na základě dat .
  • TestNG podporuje dva druhy parametrizace pomocí @ Parameter + TestNG.xml a pomocí @DataProvider
  • V @ Parameter + TestNG.xml parametry lze umístit na úrovni sady a na úrovni testu. Li

    Stejný název parametru je deklarován na obou místech; parametr testovací úrovně bude mít přednost před parametrem úrovně obleku.

  • pomocí @ Parameter + TestNG.xml lze současně nastavit pouze jednu hodnotu, ale @DataProvider vrátí 2D pole Object .
  • Pokud je DataProvider přítomen v jiné třídě než třídě, kde se nachází testovací metoda, DataProvider by měla být statická metoda .
  • Existují dva parametry podporované DataProvider jsou metody a ITestContext.