Poskytovatel dat & TestNG XML: Parametrizace v Selenium(Příklad)
Parametrizace v Selenium
Parametrizace v Selenium je proces parametrizace testovacích skriptů za účelem předání více dat do aplikace za běhu. Je to strategie provádění, která automaticky spouští testovací případy vícekrát s použitím různých hodnot. Koncept dosažený parametrizací testovacích skriptů se nazývá Data řízené testování.
Typ parametrizace v TestNG-
Aby byla parametrizace jasnější, projdeme si možnosti parametrizace v jednom z nejpopulárnějších frameworků Selenium Webdriver – TestNG.
Existují dvě cesty pomocí kterého můžeme dosáhnout parametrizace v TestNG
Parametry z Testng.xml mohou být na úrovni sady nebo testu
Parametr z DataProvider může mít jako parametr Method a ITestContext.
Pojďme si je podrobně prostudovat –
Parametry Anotace v TestNG
Parametry Anotace v TestNG je metoda používaná k předávání hodnot testovacím metodám jako argumentů pomocí souboru .xml. Uživatelé mohou být požádáni, aby předali hodnoty testovacím metodám během běhu. Metoda anotace @Parameters může být použita v jakékoli metodě s anotací @Test, @Before, @After nebo @Factory.
Anotace parametrů pomocí Testng.xml
Vyberte parametrizaci pomocí anotací, pokud se chcete vypořádat se složitostí a počet kombinací vstupů je menší.
Podívejte 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, že zadaná hodnota je stejná jako hodnota poskytnutá našimi testovacími daty
Krok 4) Opakujte 2 a 3, dokud nezadáte všechny hodnoty
Autor testu | SearchKey |
---|---|
Guru99 | Indie |
Krishna | Spojené státy americké |
Bhupesh | Čína |
Zde je příklad, jak to udělat BEZ parametrů
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)); } }
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
Nyní to parametrizujme pomocí TestNG
Chcete-li tak učinit, budete muset
- Vytvořte soubor XML, který bude ukládat parametry
-
V testu přidejte anotaci @Parameters
Zde je úplný kód
Testovací úroveň 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>
ParametrSTestNGSoubor 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)); } }
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 Apartmá (Poznámka: Apartmá)
Nyní lze parametry definovat na 2 úrovních
- Úroveň sady – parametry uvnitř tag of TestNG Soubor XML bude parametrem na úrovni sady.
- Test Level — Parametry uvnitř tag testovacího XML souboru bude parametr Test level.
Zde je stejný test s parametry na úrovni sady
POZNÁMKA: V případě, že je název parametru stejný na úrovni sady a na úrovni testu, bude mít parametr testovací úrovně přednost před úrovní sady. Takže v tom případě budou všechny třídy v této testovací úrovni sdílet přepsaný parametr a ostatní třídy, které jsou mimo testovací úroveň, budou sdílet parametr na úrovni sady.
Řešení problémů
Vydání č. 1 Hodnotu parametru v testng.xml nelze přetypovat na parametr odpovídající testovací metody, dojde k chybě.
Zvažte následující příklad
Zde je atribut 'author' roven 'Guru99', což je řetězec a v odpovídající testovací metodě očekává celočíselnou hodnotu, takže zde dostaneme výjimku.
Vydání č. 2 Vaše @Parametry nemají odpovídající hodnotu v testing.xml.
Tuto situaci můžete vyřešit přidáním @volitelný Anotace v odpovídajícím parametru v testovací metodě.
Problém č. 3: Chcete otestovat více hodnot stejného parametru pomocí Testng.xml
Jednoduchá odpověď je, že to nelze! Můžete mít více různých parametrů, ale každý parametr může mít pouze jednu hodnotu. To pomáhá zabránit pevnému zakódování hodnot do skriptu. Díky tomu je kód znovu použitelný. Představte si to jako konfigurační soubory pro váš skript. 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. Komplexní parametry je třeba vytvořit z Java jako jsou složité objekty, objekty ze souborů vlastností nebo z databáze mohou být předány metodou poskytovatele dat. Metoda je anotována @DataProvider a vrací pole objektů.
Parametry pomocí Dataprovider
Anotace @Parameters je snadná, ale pro testování s více sadami dat musíme použít Data Provider.
K vyplnění tisíců webových formulářů pomocí našeho testovacího rámce potřebujeme jinou metodologii, která nám může poskytnout velmi velkou datovou sadu v jediném toku spuštění.
Tohoto konceptu založeného na datech je dosaženo @DataProvider anotace v TestNG.
Má jen jeden atribut 'jméno'. Pokud nezadáte atribut name, bude název DataProvider stejný jako název odpovídající metody.
Poskytovatel dat se vrací dvourozměrný objekt JAVA na testovací metodu a testovací metodu, vyvolá M krát v poli objektů typu M*N. Pokud například DataProvider vrátí pole 2*3 objektů, odpovídající testovací případ bude vyvolán 2krát se 3 parametry pokaždé.
Kompletní příklad
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" } }; } }
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 vložili do nějaké jiné třídy, musíme metodu poskytovatele dat nastavit jako statickou a v testovací metodě musíme přidat atribut dataProviderClass in @Test anotace.
Příklad kódu
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" } }; }}
Typy parametrů v Dataprovider
Metoda DataProvider podporuje dva typy parametrů.
Metoda- V případě, že STEJNÝ DataProvider by se měl chovat odlišně s jinou testovací metodou, použijte parametr Method.
V následujícím příkladu
- Zkontrolujeme, zda je název metody testMethodA.
- Pokud ano, vraťte jednu sadu hodnot
- Jinak vraťte jinou sadu hodnot
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" } };} } }
Zde je výstup
ITestContext– Lze jej použít k vytvoření různých parametrů pro testovací případy na základě skupin.
V reálném životě můžete pomocí ITestContext měnit hodnoty parametrů na základě testovacích metod, hostitelů a konfigurací testu.
V následujícím příkladu kódu
- Máme 2 skupiny A a B
- Každá testovací metoda je přiřazena skupině
- Pokud je hodnota skupiny A, je vrácena konkrétní sada dat
- Pokud je hodnota skupiny B, je vrácena jiná datová sada
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; } }
Poznámka: Pokud přímo spustíte třídu testování, nejprve zavolá poskytovatele dat, který nemůže získat informace o skupinách, protože skupiny nejsou dostupné. Ale místo toho, pokud tuto třídu zavoláte přes testng.xml, bude mít informace o skupinách dostupné s ITestContext. K volání testu použijte následující XML
<!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>
Shrnutí
- Parametrizace je potřeba vytvořit Data řízené testování.
- TestNG podporují dva druhy parametrizace pomocí @Parametr+TestNG. Xml a používání@DataProvider
-
In @Parametr+TestNG. Xml parametry lze umístit na úroveň sady a testovací úroveň. Li
Na obou místech je deklarován stejný název parametru; parametr úrovně testu dostane přednost před parametrem úrovně obleku.
- pomocí @Parameter+TestNG.xml lze nastavit pouze jednu hodnotu najednou, ale @DataProvider se vrátí 2D pole objektů.
- Pokud je DataProvider přítomen v jiné třídě, pak ve třídě, kde se nachází testovací metoda,DataProvider by měla být statická metoda.
- Podporovány jsou dva parametry DataProvider jsou Metoda si ITestContext.