Adatszolgáltató és TestNG XML: Paraméterezés be Selenium(Példa)
Paraméterezés be Selenium
Paraméterezés be Selenium egy folyamat a tesztszkriptek paraméterezésére annak érdekében, hogy futás közben több adatot továbbítson az alkalmazásnak. Ez egy olyan végrehajtási stratégia, amely automatikusan futtatja a teszteseteket különböző értékek használatával. A tesztszkriptek paraméterezésével elért koncepciót ún Adatvezérelt tesztelés.
A paraméterezés típusa TestNG-
A paraméterezés egyértelműbbé tétele érdekében áttekintjük a paraméterezési lehetőségeket az egyik legnépszerűbb keretrendszerben Selenium Webdriver – TestNG.
Vannak két út amivel paraméterezést érhetünk el TestNG
- A rendszer segítségével a paraméterek kommentár és a TestNG XML fájlt.
- A rendszer segítségével a DataProvider kommentár.
A Testng.xml paraméterei csomag- vagy tesztszintűek lehetnek
A DataProvider paramétere a Method és az ITestContext paramétert veheti igénybe.
Tanulmányozzuk őket részletesen -
Paraméterek Annotáció be TestNG
Paraméterek Annotáció be TestNG egy módszer, amellyel értékeket adnak át a tesztmetódusoknak argumentumként .xml fájl használatával. Előfordulhat, hogy a felhasználóknak át kell adniuk az értékeket a tesztmódszereknek a futási idő alatt. A @Parameters annotációs módszer bármilyen @Test, @Before, @After vagy @Factory annotációval rendelkező metódusban használható.
Paraméter-annotáció a Testng.xml-lel
Válassza ki a paraméterezést annotációk használatával, ha összetettséggel kíván foglalkozni, és kevesebb bemeneti kombinációt szeretne.
Lássuk, hogyan működik ez
Teszt forgatókönyv
1. lépés) Indítsa el a böngészőt, és lépjen a Google.com oldalra
2. lépés) Írjon be egy keresési kulcsszót
3. lépés) Ellenőrizze, hogy a bevitt érték megegyezik-e a tesztadatok által megadott értékkel
4. lépés) Ismételje meg a 2. és 3. lépést, amíg az összes értéket be nem adja
| Tesztszerző | SearchKey |
|---|---|
| Guru99 | India |
| Krishna | USA |
| Bhupesh | Kína |
Itt van egy példa, hogyan kell ezt paraméterek NÉLKÜL csinálni
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));
}
}
Egy tanulmány, a fenti példa. Képzeljük csak el, milyen bonyolult lesz a kód, ha ezt 3 bemeneti kombinációra tesszük
Most paraméterezzük ezt a segítségével TestNG
Ehhez meg kell tennie
- Hozzon létre egy XML fájlt, amely tárolja a paramétereket
-
A tesztben adjon hozzá @Parameters megjegyzést
Itt a teljes kód
Teszt szint 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>
ParaméterWithTestNGXML.java fájl
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));
}
}
Útmutató a szkript futtatásához, válassza ki az XML-fájlt, majd a Futtatás NG Suite tesztként
Kattintson jobb gombbal az .xml fájlra -> Futtatás másként -> Testng Lakosztály (Megjegyzés: Lakosztály)
Most a paraméterek 2 szinten definiálhatók
- Suite szint – A paraméterek a címke TestNG Az XML-fájl egy csomagszintű paraméter lesz.
- Tesztszint — A paraméterek a A tesztelő XML fájl címkéje egy tesztszintű paraméter lesz.
Itt ugyanaz a teszt a csomagszintű paraméterekkel
JEGYZET: Abban az esetben, ha a paraméter neve megegyezik a csomagszinten és a tesztszinten, akkor a tesztszintű paraméter előnyt élvez a csomagszinttel szemben. Tehát ebben az esetben az adott tesztszinten belüli összes osztály megosztja a felülírt paramétert, a többi, a tesztszinten kívüli osztály pedig a csomagszintű paramétert.
Hibaelhárítás
1. szám A testng.xml-ben található paraméterérték nem írható be a megfelelő tesztmódszer paraméterébe, ez hibát fog kiütni.
Tekintsük a következő példát
Itt a „szerző” attribútum egyenlő a következővel:GuruA 99' egy karakterlánc, és a hozzá tartozó tesztmetódusban egész értéket vár, így itt kivételt kapunk.
2. szám A @Parameters nem rendelkezik megfelelő értékkel a testing.xml fájlban.
Ezt a helyzetet hozzáadásával oldhatja meg @választható kommentár a megfelelő paraméterben a vizsgálati módszerben.
3. probléma: Ugyanannak a paraméternek több értékét szeretné tesztelni a Testng.xml segítségével
A válasz egyszerű: ezt nem lehet megtenni! Több különböző paraméter is lehet, de minden paraméternek csak egy értéke lehet. Ez segít megakadályozni, hogy az értékek keménykódolásúak legyenek a szkriptben. Ez újrafelhasználhatóvá teszi a kódot. Tekintsd úgy, mint a szkripted konfigurációs fájljait. Ha több értéket szeretne használni egy paraméterhez, használja a DataProviders-t
Adatszolgáltató be TestNG
Adatszolgáltató be TestNG egy olyan módszer, amelyet akkor használnak, amikor a felhasználónak összetett paramétereket kell átadnia. Összetett paramétereket kell létrehozni Java például összetett objektumok, tulajdonságfájlokból vagy adatbázisokból származó objektumok az adatszolgáltató metódussal továbbíthatók. A metódust a @DataProvider jegyzetekkel látja el, és objektumok tömbjét adja vissza.
Paraméterek a Dataprovider használatával
A @Parameters megjegyzés egyszerű, de több adatkészlettel történő teszteléshez az Adatszolgáltatót kell használnunk.
A tesztelési keretrendszerünkkel több ezer webes űrlap kitöltéséhez más módszertanra van szükségünk, amely nagyon nagy adatkészletet tud biztosítani egyetlen végrehajtási folyamatban.
Ezt az adatvezérelt koncepciót úgy érik el @DataProvider megjegyzés be TestNG.
Csak egy van benne attribútum "név". Ha nem adja meg a name attribútumot, akkor az Adatszolgáltató neve megegyezik a megfelelő metódusnévvel.
Az adatszolgáltató visszaküldi egy kétdimenziós JAVA objektum a tesztmódszerhez és a tesztmódszerhez M-szer hív meg egy M*N típusú objektumtömbben. Például, ha a DataProvider egy 2*3 objektumból álló tömböt ad vissza, akkor a megfelelő teszteset kétszer 2 paraméterrel kerül meghívásra.
Teljes példa
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" }
};
}
}
A DataProvider meghívása különböző osztályokból
Alapértelmezés szerint a DataProvider ugyanabban az osztályban található, ahol a tesztmódszer vagy annak alaposztálya. Ahhoz, hogy egy másik osztályba helyezzük, statikussá kell tenni az adatszolgáltató metódust, a tesztmetódusban pedig hozzá kell adni egy attribútumot dataProviderClass in @Teszt kommentár.
Code Példa
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" }
};
}}
Paraméterek típusai az adatszolgáltatóban
A DataProvider metódus kétféle paramétert támogat.
Módszer- Ha a AZONOS A DataProvidernek eltérően kell viselkednie különböző vizsgálati módszerekkel, használja a Method paramétert.
A következő példában
- Ellenőrizzük, hogy a metódus neve testMethodA.
- Ha igen, adjon vissza egy értékkészletet
- Ellenkező esetben egy másik értékkészletet ad vissza
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" }
};}
}
}
Itt a kimenet
ITestContext– Csoportonként különböző paraméterek létrehozására használható tesztesetekhez.
A való életben az ITestContext segítségével módosíthatja a paraméterértékeket a tesztmódszerek, gazdagépek és a teszt konfigurációi alapján.
A következő kódpéldában
- 2 A és B csoportunk van
- Minden vizsgálati módszer egy csoporthoz van rendelve
- Ha a csoport értéke A, akkor egy adott adatkészlet kerül visszaadásra
- Ha a csoport értéke B, akkor egy másik adatkészlet kerül visszaadásra
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;
}
}
Megjegyzés: Ha közvetlenül futtatja a testng osztályt, először az adatszolgáltatót hívja meg, amely nem tud csoportinformációkat lekérni, mivel a csoportok nem állnak rendelkezésre. De ehelyett, ha ezt az osztályt a testng.xml-n keresztül hívja meg, akkor az ITestContext segítségével elérhető lesz a csoportinformáció. A teszt meghívásához használja a következő XML-t
<!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>
Összegzésként
- Paraméterezés létrehozásához szükséges Adatvezérelt tesztelés.
- TestNG kétféle paraméterezést támogat, használatával @Parameter+TestNG. Xml és használja@DataProvider
-
In @Parameter+TestNG. Xml A paraméterek csomagszinten és tesztszinten helyezhetők el. Ha
Mindkét helyen ugyanaz a paraméternév van deklarálva; tesztszint paraméter előnyben részesíti az öltönyszint paramétert.
- @Parameter+ használatávalTestNG.xml egyszerre csak egy érték állítható be, de a @DataProvider visszatér egy 2d objektum tömb.
- Ha a DataProvider jelen van a másik osztályban, akkor az osztály, ahol a tesztmódszer található,DataProvider kell lennie statikus módszer.
- Két paramétert támogat DataProvider faliórái Módszer és a ITestContext.
















