Poskytovatel dat & TestNG XML: Parametrizace v Selenium(Příklad)

Když vytváříme software, vždy si přejeme, aby fungoval jinak s jinou sadou dat. Pokud jde o Testování stejný kus softwaru, nemůžeme být nespravedliví, když jej testujeme pouze s jednou sadou dat. Zde opět musíme ověřit, že náš systém využívá všechny sady kombinací, které by měly podporovat. K tomu potřebujeme parametrizovat naše testovací scipty. Zde je parametrizace na obrázku.

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

  1. S pomocí parametry Anotace si TestNG XML soubor.

    Typ parametrizace In TestNG

  2. S pomocí DataProvider anotace.

    Typ parametrizace In TestNG

Typ parametrizace In 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í

Parametry Anotace S Testng.Xml

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

Parametry Anotace S Testng.Xml

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á)

ParametrSTestNGSoubor XML.java

Nyní lze parametry definovat na 2 úrovních

  1. Úroveň sady – parametry uvnitř tag of TestNG Soubor XML bude parametrem na úrovni sady.
  2. Test Level — Parametry uvnitř tag testovacího XML souboru bude parametr Test level.

Zde je stejný test s parametry na úrovni sady

ParametrSTestNGSoubor XML.java

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.

ParametrSTestNGSoubor XML.java

Ř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

Řešení potíží

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ě.

Řešení potíží

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.

Parametry pomocí Dataprovider

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é.

Parametry pomocí Dataprovider

Kompletní příklad

Parametry pomocí Dataprovider

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.

Vyvolat DataProvider z jiné třídy

Příklad kódu

Vyvolat DataProvider z jiné třídy

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.

Typy parametrů v Dataprovider

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

Typy parametrů v Dataprovider

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.

Typy parametrů v Dataprovider

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.