Adatszolgáltató és TestNG XML: Paraméterezés be Selenium(Példa)

Miközben szoftvereket készítünk, mindig azt kívánjuk, hogy másképp működjön más adatkészlettel. Amikor arra kerül sor Tesztelés ugyanazt a szoftvert, nem lehet igazságtalan, ha egyetlen adatkészlettel teszteljük. Itt is meg kell győződnünk arról, hogy rendszerünk minden olyan kombinációt alkalmaz, amely várhatóan támogatni fogja. Ehhez paramétereznünk kell a tesztszkripteinket. Itt jön a paraméterezés a képen.

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

  1. A rendszer segítségével a paraméterek kommentár és a TestNG XML fájlt.

    Paraméterezés típusa Be TestNG

  2. A rendszer segítségével a DataProvider kommentár.

    Paraméterezés típusa Be TestNG

Paraméterezés típusa Be TestNG

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

Paraméterek megjegyzése a Testng.Xml segítségével

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

Paraméterek megjegyzése a Testng.Xml segítségével

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)

ParaméterWithTestNGXML.java fájl

Most a paraméterek 2 szinten definiálhatók

  1. Suite szint – A paraméterek a címke TestNG Az XML-fájl egy csomagszintű paraméter lesz.
  2. 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

ParaméterWithTestNGXML.java fájl

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.

ParaméterWithTestNGXML.java fájl

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

Hibaelhárítás

Itt az 'author' attribútum egyenlő a 'Guru99'-el, amely egy karakterlánc, és a megfelelő tesztmódszerben egész értéket vár, ezért itt kivételt fogunk kapni.

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.

Hibaelhárítás

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.

Paraméterek Dataprovider használatával

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.

Paraméterek Dataprovider használatával

Teljes példa

Paraméterek Dataprovider használatával

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.

A DataProvider meghívása más osztályból

Kódpélda

A DataProvider meghívása más osztályból

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.

Paraméterek típusai az adatszolgáltatóban

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

Paraméterek típusai az adatszolgáltatóban

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.

Paraméterek típusai az adatszolgáltatóban

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.