Pri vytváraní softvéru si vždy prajeme, aby fungoval inak s inou sadou údajov. Pokiaľ ide o testovanie rovnakého softvéru, nemôžeme byť nespravodliví, keď ho otestujeme iba s jednou sadou údajov. Opäť tu musíme overiť, či náš systém prijíma všetky súbory kombinácií, od ktorých sa očakáva, že budú podporovať. Na to potrebujeme parametrizovať naše testovacie scipty. Prichádza parametrizácia na obrázku.
Parametrizácia selénu
Parametrizácia v seléne je proces parametrizácie testovacích skriptov, aby sa aplikácii dalo za behu odovzdať viac údajov. Je to stratégia vykonávania, ktorá automaticky spúšťa testovacie prípady niekoľkokrát s použitím rôznych hodnôt. Koncept dosiahnutý parametrizáciou testovacích skriptov sa nazýva Data Driven Testing .
V tomto návode sa naučíte
- Typ parametrizácie v TestNG-
- Anotácia parametrov s Testng.xml
- Riešenie problémov
- Parametre využívajúce Dataprovider
- Vyvolajte DataProvider z inej triedy
- Typy parametrov v Dataprovideri
Typ parametrizácie v TestNG-
Aby sme objasnili parametrizáciu, prejdeme si možnosti parametrizácie v jednom z najpopulárnejších rámcov Selenium Webdriver - TestNG .
Existujú dva spôsoby, ako môžeme dosiahnuť parametrizáciu v TestNG
- Pomocou anotácie parametrov a súboru XML TestNG .
- S pomocou anotácie DataProvider .
Parametre z Testng.xml môžu byť úrovne sady alebo testu
Parameter z DataProvider môže brať ako parameter Method a ITestContext.
Poďme si ich podrobne preštudovať -
Anotácia parametrov v TestNG
Anotácia parametrov v TestNG je metóda používaná na odovzdávanie hodnôt testovacím metódam ako argumentov pomocou súboru .xml. Od používateľov sa môže vyžadovať, aby hodnoty odovzdali testovacím metódam počas doby behu. Metódu anotácie @Parameters možno použiť v akejkoľvek metóde s anotáciou @Test, @Before, @After alebo @Factory.
Anotácia parametrov s Testng.xml
Ak sa chcete vysporiadať so zložitosťou a počtom vstupných kombinácií je menej, vyberte parametrizáciu pomocou anotácií.
Pozrime sa, ako to funguje
Scenár testu
Krok 1) Spustite prehliadač a prejdite na stránku Google.com
Krok 2) Zadajte hľadané kľúčové slovo
Krok 3) Skontrolujte, či je zadaná hodnota rovnaká ako hodnota poskytnutá z našich testovacích údajov
Krok 4) Opakujte kroky 2 a 3, kým nezadáte všetky hodnoty
Autor skúšky | SearchKey |
Guru99 | India |
Krišna | USA |
Bhupesh | Čína |
Tu je príklad toho, ako to urobiť BEZ parametrov
parametre balenia;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;verejná trieda NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Ovládač WebDriver;@Testpublic void testNoParameter () vyvolá InterruptedException {Autor reťazca = "guru99";Reťazec searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Hľadanie textu v textovom poli googlesearchText.sendKeys (searchKey);System.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);System.out.println ("Vlákno bude teraz spať");Závit. Spánok (3000);System.out.println ("Hodnota vo vyhľadávacom poli Google =" + searchText.getAttribute ("hodnota") + "::: Hodnota zadaná vstupom =" + searchKey);// overenie hodnoty vo vyhľadávacom poli GoogleAssertJUnit.assertTrue (searchText.getAttribute ("hodnota"). EqualsIgnoreCase (searchKey));}}
Štúdia, vyššie uvedený príklad. Len si predstavte, aký zložitý bude kód, keď to urobíme pre 3 vstupné kombinácie
Poďme to teraz parametrizovať pomocou TestNG
Ak to chcete urobiť, budete musieť
- Vytvorte súbor XML, ktorý uloží parametre
- V teste pridajte anotáciu @Parameters
Tu je celý kód
Úroveň testu TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Súbor ParameterWithTestNGXML.java
parametre balenia;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;verejná trieda ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Ovládač WebDriver;@Test@Parameters ({"autor", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Autor reťazca, reťazec searchKey) hodí InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Hľadanie textu v textovom poli googlesearchText.sendKeys (searchKey);System.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);System.out.println ("Vlákno bude teraz spať");Závit. Spánok (3000);System.out.println ("Hodnota vo vyhľadávacom poli Google =" + searchText.getAttribute ("hodnota") + "::: Hodnota zadaná vstupom =" + searchKey);// overenie hodnoty vo vyhľadávacom poli GoogleAssertJUnit.assertTrue (searchText.getAttribute ("hodnota"). EqualsIgnoreCase (searchKey));}}
Pokyny na spustenie skriptu, vyberte súbor XML a Spustiť ako test NG Suite
Kliknite pravým tlačidlom myši na súbor .xml -> Spustiť ako -> Testng Suite (Poznámka: Suite)
Teraz je možné parametre definovať na 2 úrovniach
- Úroveň balíka - Parametre vo vnútri značky
súboru XML TestNG budú parametrom na úrovni balíka. - Úroveň testu - Parametre vo vnútri značky
testovacieho súboru XML budú parametrom úrovne testu.
Tu je rovnaký test s parametrami na úrovni balíka
POZNÁMKA: V prípade, že je názov parametra rovnaký na úrovni sady aj na úrovni testu, potom bude mať parameter úrovne testu prednosť pred úrovňou sady. V takom prípade teda všetky triedy na tejto testovacej úrovni budú zdieľať prepísaný parameter a ostatné triedy, ktoré sú mimo testovacej úrovne, budú zdieľať parameter na úrovni sady.
Riešenie problémov
Problém č. 1 Hodnotu parametra v testng.xml nie je možné obsadiť do parametra zodpovedajúcej testovacej metódy, pretože to spôsobí chybu.
Uvažujme o nasledujúcom príklade
Tu sa atribút „autor“ rovná „Guru99“, čo je reťazec a v zodpovedajúcej testovacej metóde očakáva celočíselnú hodnotu, takže tu dostaneme výnimku.
Problém č. 2 Vaše parametre @Parameters nemajú zodpovedajúcu hodnotu v testovaní.xml.
Túto situáciu môžete vyriešiť pridaním komentára @optional do príslušného parametra v testovacej metóde.
Problém č. 3: Chcete otestovať viac hodnôt toho istého parametra pomocou súboru Testng.xml
Jednoduchá odpoveď je, že sa to nedá urobiť! Môžete mať viac rôznych parametrov, ale každý parameter môže mať iba jednu hodnotu. To pomáha zabrániť tomu, aby sa do skriptu dostali hodnoty napevno. Vďaka tomu je kód znovu použiteľný. Ber to ako konfiguračné súbory pre svoj skript. Ak chcete pre parameter použiť viac hodnôt, použite DataProviders
Poskytovateľ údajov v TestNG
Poskytovateľ údajov v TestNG je metóda, ktorá sa používa, keď používateľ potrebuje splnenie zložitých parametrov. Zložité parametre je potrebné vytvárať z prostredia Java, ako sú zložité objekty, objekty zo súborov vlastností alebo z databázy je možné odovzdávať metódou poskytovateľa údajov. Metódu komentuje @DataProvider a vracia pole objektov.
Parametre využívajúce Dataprovider
@Parameters anotácia je ľahká, ale na otestovanie s viacerými množinami údajov musíme použiť poskytovateľa údajov.
Na vyplnenie tisícov webových formulárov pomocou nášho testovacieho rámca potrebujeme inú metodiku, ktorá nám môže poskytnúť veľmi rozsiahly súbor údajov v jednom toku vykonávania.
Tieto dáta riadený koncept je dosiahnutá @DataProvider anotácie TestNG.
Má iba jeden atribút „name“ . Ak nezadáte atribút name, potom bude názov DataProvidera rovnaký ako názov zodpovedajúcej metódy.
Poskytovateľ údajov vráti dvojrozmerný objekt JAVA do testovacej metódy a testovacia metóda vyvolá M-krát v poli objektov typu M * N. Napríklad, ak DataProvider vráti pole s objektmi 2 * 3, bude zodpovedajúci testcase vyvolaný dvakrát a zakaždým s 3 parametrami.
Kompletný príklad
parametre balenia;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;verejná trieda ParameterByDataprovider {Ovládač WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavenie verejnej neplatnosti () {// Vytvorenie objektu ovládača firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Testovací prípad na overenie vyhľadávacieho poľa Google* @param autor* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (autor reťazca, reťazec searchKey) hodí InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// hľadaná hodnota vo vyhľadávacom poli GooglesearchText.sendKeys (searchKey);System.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);Reťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Overte, či je hodnota vo vyhľadávacom poli Google správnaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], kde prvý stĺpec obsahuje „autora“* a druhý stĺpec obsahuje reťazec „searchKey“* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {vrátiť nový objekt [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Vyvolajte DataProvider z inej triedy
V predvolenom nastavení sa DataProvider nachádza v rovnakej triede, kde je testovacia metóda, alebo v jej základnej triede. Aby sme to mohli dať do nejakej inej triedy, musíme urobiť metódu poskytovateľa dát ako statickú a v testovacej metóde musíme pridať atribút dataProviderClass do anotácie @Test .
Príklad kódu
TestClass ParameterDataproviderWithClassLevel.java
parametre balenia;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;verejná trieda ParameterDataproviderWithClassLevel {Ovládač WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavenie verejnej neplatnosti () {System.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (autor reťazca, reťazec searchKey) hodí InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Hľadá text v textovom poli googlesearchText.sendKeys (searchKey);System.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);// získa text z vyhľadávacieho poľaReťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// overiť, či má vyhľadávacie pole správnu hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parametre balenia;import org.testng.annotations.DataProvider;verejná trieda DataproviderClass {@DataProvider (name = "SearchProvider")verejný statický objekt [] [] getDataFromDataprovider () {vrátiť nový objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Typy parametrov v Dataprovideri
Metóda DataProvider podporuje dva typy parametrov.
Metóda - Ak by sa mal SAME DataProvider správať odlišne s rôznymi testovacími metódami, použite parameter Method.
V nasledujúcom príklade
- Skontrolujeme, či je názov metódy testMethodA.
- Ak áno, vráťte jednu sadu hodnôt
- Inak vráti inú množinu hodnôt
parametre balenia;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;verejná trieda ParameterByMethodInDataprovider {Ovládač WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestnastavenie verejnej neplatnosti () {System.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (autor reťazca, reťazec searchKey) hodí InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Hľadaný text vo vyhľadávacom polisearchText.sendKeys (searchKey);// Vytlačiť autora a hľadaný reťazecSystem.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);Reťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Overte, či textové pole google zobrazuje správnu hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) hodí InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Hľadaný text vo vyhľadávacom polisearchText.sendKeys (searchKey);// Tlač iba hľadaného reťazcaSystem.out.println ("Vitajte -> Neznámy používateľ Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);Reťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Overte, či textové pole google zobrazuje správnu hodnotuAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tu DataProvider vracia hodnotu na základe názvu testovacej metódy* @param m* @ návrat** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (metóda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {vrátiť nový objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}else {vrátiť nový objekt [] [] {{"Kanada"},{ "Rusko" },{"Japonsko"}};}}}
Tu je výstup
ITestContext - Môže sa použiť na vytvorenie rôznych parametrov pre testovacie prípady na základe skupín.
V reálnom živote môžete pomocou ITestContext meniť hodnoty parametrov na základe testovacích metód, hostiteľov a konfigurácií testu.
V nasledujúcom príklade kódu
- Máme 2 skupiny A a B.
- Každá skúšobná metóda je priradená skupine
- Ak je hodnota skupiny A, vráti sa konkrétna množina údajov
- Ak je hodnota skupiny B, vráti sa iná množina údajov
parametre balenia;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;verejná trieda ParameterByITestContextInDataprovider {Ovládač WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (skupiny = {"A", "B"})nastavenie verejnej neplatnosti () {System.setProperty ("webdriver.gecko.driver", driverPath);ovládač = nový FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (autor reťazca, reťazec searchKey) hodí InterruptedException {{// prehľadať textové pole googleWebElement searchText = driver.findElement (By.name ("q"));// hľadaj na ňom hodnotusearchText.sendKeys (searchKey);System.out.println ("Vitajte ->" + autor + "Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);Reťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// overí správnu hodnotu vo vyhľadávacom poliAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) hodí InterruptedException {{// vyhľadať vyhľadávacie pole googleWebElement searchText = driver.findElement (By.name ("q"));// hľadaj na ňom hodnotusearchText.sendKeys (searchKey);System.out.println ("Vitajte -> Neznámy používateľ Váš vyhľadávací kľúč je ->" + searchKey);Závit. Spánok (3000);Reťazec testValue = searchText.getAttribute ("hodnota");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// overí správnu hodnotu vo vyhľadávacom poliAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tu poskytne DAtaProvider pole objektov na základe ITestContext* @param c* @ návrat* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Objekt [] [] groupArray = null;pre (Skupina reťazcov: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nový objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};prestávka;}else if (group.equalsIgnoreCase ("B")){groupArray = nový objekt [] [] {{"Kanada"},{ "Rusko" },{"Japonsko"}};}prestávka;}návrat groupArray;}}
Poznámka: Ak svoju testovaciu triedu spustíte priamo, najskôr zavolá dátového poskytovateľa, ktorý nemôže získať informácie o skupinách, pretože skupiny nie sú k dispozícii. Ale ak túto triedu zavoláte cez testng.xml, bude mať k dispozícii informácie o skupinách s ITestContext. Na vyvolanie testu použite nasledujúci kód XML
Zhrnutie :
- Na vytvorenie testovania na základe údajov je potrebné parametrizovať .
- TestNG podporuje dva druhy parametrizácie, pomocou @ Parameter + TestNG.xml a pomocou @DataProvider
- V parametroch @ Parameter + TestNG.xml je možné umiestniť parametre na úrovni balíka a na úrovni testu. Ak
Rovnaký názov parametra je deklarovaný na oboch miestach; parameter úrovne testu bude mať prednosť pred parametrom úrovne obleku.
- pomocou @ Parameter + TestNG.xml je možné naraz nastaviť iba jednu hodnotu, ale @DataProvider vráti 2d pole Object .
- Ak je DataProvider prítomný v inej triede ako triede, kde sa nachádza testovacia metóda, mal by byť DataProvider statickou metódou .
- Existujú dva parametre podporované DataProvider sú metódy a ITestContext.