Datenanbieter & TestNG XML: Parametrisierung in Selenium(Beispiel)

Wenn wir Software erstellen, wรผnschen wir uns immer, dass sie mit einem anderen Datensatz anders funktioniert. Wenn es darum geht Tests Da es sich um dieselbe Software handelt, kรถnnen wir nicht unfair sein, sie mit nur einem Datensatz zu testen. Auch hier mรผssen wir รผberprรผfen, ob unser System alle erwarteten Kombinationen akzeptiert. Dazu mรผssen wir unsere Testskripte parametrisieren. Hier kommt die Parametrisierung ins Bild.

Parametrierung in Selenium

Parametrierung in Selenium ist ein Prozess zur Parametrisierung der Testskripte, um zur Laufzeit mehrere Daten an die Anwendung zu รผbergeben. Es handelt sich um eine Ausfรผhrungsstrategie, bei der Testfรคlle automatisch mehrmals mit unterschiedlichen Werten ausgefรผhrt werden. Das durch die Parametrisierung der Testskripte erreichte Konzept wird aufgerufen Datengesteuertes Testen.

Art der Parametrierung in TestNG-

Um die Parametrisierung klarer zu machen, gehen wir die Parametrisierungsoptionen in einem der beliebtesten Frameworks durch Selenium Webtreiber โ€“ TestNG.

Es gibt zwei Arten wodurch wir eine Parametrisierung erreichen kรถnnen TestNG

  1. Mit Hilfe von KenngrรถรŸen Anmerkung , TestNG XML Datei.

    Art der Parametrierung in TestNG

  2. Mit Hilfe von Datenanbieter Anmerkung.

    Art der Parametrierung in TestNG

Art der Parametrierung in TestNG

Parameter aus Testng.xml kรถnnen Suite- oder Testebene sein

Parameter von DataProvider kรถnnen Method und ITestContext als Parameter annehmen.

Lassen Sie uns sie im Detail studieren โ€“

Parameteranmerkung in TestNG

Parameteranmerkung in TestNG ist eine Methode, mit der Werte mithilfe einer XML-Datei als Argumente an die Testmethoden รผbergeben werden. Benutzer mรผssen die Werte mรถglicherweise wรคhrend der Laufzeit an die Testmethoden รผbergeben. Die Annotationsmethode @Parameters kann in jeder Methode mit der Annotation @Test, @Before, @After oder @Factory verwendet werden.

Parameterannotation mit Testng.xml

Wรคhlen Sie die Parametrisierung mithilfe von Anmerkungen, wenn Sie sich mit der Komplexitรคt befassen mรถchten und die Anzahl der Eingabekombinationen geringer ist.

Mal sehen, wie das funktioniert

Testszenario

Schritt 1) โ€‹โ€‹Starten Sie den Browser und gehen Sie zu Google.com

Schritt 2) Geben Sie einen Suchbegriff ein

Parameterannotation mit Testng.Xml

Schritt 3) รœberprรผfen Sie, ob der eingegebene Wert mit dem aus unseren Testdaten bereitgestellten Wert รผbereinstimmt

Schritt 4) Wiederholen Sie 2 und 3, bis alle Werte eingegeben sind

Testautor Suchschlรผssel
Guru99 Indien
Krishna USA
Bhupesh China, Kambodscha

Hier ist ein Beispiel dafรผr, wie es OHNE Parameter gemacht wird

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));
}
}

Eine Studie, das obige Beispiel. Stellen Sie sich vor, wie komplex der Code wird, wenn wir dies fรผr 3 Eingabekombinationen tun

Lassen Sie uns dies nun mit parametrisieren TestNG

Dazu mรผssen Sie Folgendes tun

  • Erstellen Sie eine XML-Datei, in der die Parameter gespeichert werden
  • Fรผgen Sie im Test die Annotation @Parameters hinzu

Parameterannotation mit Testng.Xml

Hier ist der vollstรคndige Code

Testlevel 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>

ParameterWithTestNGXML.java-Datei

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

}
}

Anweisungen zum Ausfรผhren des Skripts, zum Auswรคhlen der XML-Datei und zum Ausfรผhren als Test NG Suite

Klicken Sie mit der rechten Maustaste auf die XML-Datei -> Ausfรผhren als -> Testng Suite (Hinweis: Suite)

ParameterWithTestNGXML.java-Datei

Nun kรถnnen Parameter auf 2 Ebenen definiert werden

  1. Suite-Ebene โ€“ Die Parameter innerhalb der Tag von TestNG Die XML-Datei ist ein Parameter auf Suite-Ebene.
  2. Testebene โ€“ Die Parameter innerhalb der Das Tag der XML-Testdatei ist ein Teststufenparameter.

Hier ist derselbe Test mit Parametern auf Suite-Ebene

ParameterWithTestNGXML.java-Datei

Anmerkungen: Wenn der Parametername in der Suite-Ebene und der Testebene gleich ist, erhรคlt der Parameter der Testebene Vorrang vor der Suite-Ebene. In diesem Fall teilen sich also alle Klassen innerhalb dieser Testebene den รผberschriebenen Parameter, und andere Klassen auรŸerhalb der Testebene teilen sich den Parameter auf Suite-Ebene.

ParameterWithTestNGXML.java-Datei

Problemlรถsung

Ausgabe # 1 Der Parameterwert in testng.xml kann nicht auf den Parameter der entsprechenden Testmethode umgewandelt werden. Andernfalls wird ein Fehler ausgegeben.

Betrachten Sie das folgende Beispiel

Fehlerbehebung

Hier ist das Attribut 'author' gleich 'Guru99' ist eine Zeichenkette, die entsprechende Testmethode erwartet jedoch einen ganzzahligen Wert, daher erhalten wir hier eine Ausnahme.

Ausgabe # 2 Ihre @Parameters haben keinen entsprechenden Wert in test.xml.

Sie kรถnnen diese Situation durch Hinzufรผgen lรถsen @Optional Anmerkung im entsprechenden Parameter in der Testmethode.

Fehlerbehebung

Fehler 3: Sie mรถchten mehrere Werte desselben Parameters mit Testng.xml testen

Die einfache Antwort lautet: Das geht nicht! Sie kรถnnen mehrere unterschiedliche Parameter haben, aber jeder Parameter kann nur einen einzigen Wert haben. Dadurch wird verhindert, dass Werte fest im Skript codiert werden. Dadurch wird Code wiederverwendbar. Betrachten Sie es als Konfigurationsdateien fรผr Ihr Skript. Wenn Sie mehrere Werte fรผr einen Parameter verwenden mรถchten, verwenden Sie DataProviders

Datenanbieter in TestNG

Datenanbieter in TestNG ist eine Methode, die verwendet wird, wenn ein Benutzer komplexe Parameter รผbergeben muss. Komplexe Parameter mรผssen erstellt werden aus Java wie komplexe Objekte, Objekte aus Eigenschaftendateien oder aus einer Datenbank kรถnnen von der Datenprovidermethode รผbergeben werden. Die Methode ist mit @DataProvider kommentiert und gibt ein Array von Objekten zurรผck.

Parameter mit Dataprovider

Die Annotation @Parameters ist einfach, aber zum Testen mit mehreren Datensรคtzen mรผssen wir den Datenanbieter verwenden.

Um Tausende von Webformularen mit unserem Test-Framework auszufรผllen, benรถtigen wir eine andere Methodik, die uns einen sehr groรŸen Datensatz in einem einzigen Ausfรผhrungsablauf liefern kann.

Dieses datengesteuerte Konzept wird erreicht durch @Datenanbieter Anmerkung in TestNG.

Parameter mit Datenprovider

Es hat nur einen Attribut 'Name'. Wenn Sie das Namensattribut nicht angeben, ist der Name des DataProviders derselbe wie der entsprechende Methodenname.

Der Datenanbieter gibt zurรผck ein zweidimensionales JAVA-Objekt zur Testmethode und zur Testmethode, ruft M-mal in einem Objektarray vom Typ M*N auf. Wenn der DataProvider beispielsweise ein Array mit 2*3 Objekten zurรผckgibt, wird der entsprechende Testfall zweimal mit jeweils drei Parametern aufgerufen.

Parameter mit Datenprovider

Vollstรคndiges Beispiel

Parameter mit Datenprovider

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" }
        };

    }

}

Rufen Sie DataProvider aus einer anderen Klasse auf

StandardmรครŸig befindet sich DataProvider in derselben Klasse wie die Testmethode oder deren Basisklasse. Um es in eine andere Klasse einzufรผgen, mรผssen wir die Datenanbietermethode statisch machen und in der Testmethode ein Attribut hinzufรผgen dataProviderClass in @Prรผfung Anmerkung.

Rufen Sie DataProvider aus einer anderen Klasse auf

Code Beispiel

Rufen Sie DataProvider aus einer anderen Klasse auf

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" }
            };  
}}

Arten von Parametern im Datenanbieter

Es gibt zwei Arten von Parametern, die von der DataProvider-Methode unterstรผtzt werden.

Methodik- Wenn die GLEICH Der Datenanbieter sollte sich bei unterschiedlichen Testmethoden unterschiedlich verhalten. Verwenden Sie den Parameter โ€žMethodeโ€œ.

Arten von Parametern im Datenanbieter

Im folgenden Beispiel

  • Wir prรผfen, ob der Methodenname testMethodA ist.
  • Wenn ja, wird ein Wertesatz zurรผckgegeben
  • Andernfalls wird ein weiterer Wertesatz zurรผckgegeben
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" }
            };}       
    }
}

Hier ist die Ausgabe

Arten von Parametern im Datenanbieter

ITestContextโ€“ Es kรถnnen verschiedene Parameter fรผr Testfรคlle basierend auf Gruppen erstellt werden.

Im wirklichen Leben kรถnnen Sie ITestContext verwenden, um Parameterwerte basierend auf Testmethoden, Hosts und Konfigurationen des Tests zu variieren.

Arten von Parametern im Datenanbieter

Im folgenden Codebeispiel

  • Wir haben 2 Gruppen A und B
  • Jede Prรผfmethode ist einer Gruppe zugeordnet
  • Wenn der Wert der Gruppe A ist, wird ein bestimmter Datensatz zurรผckgegeben
  • Wenn der Wert der Gruppe B ist, wird ein anderer Datensatz zurรผckgegeben
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;		
	}
}

Hinweis: Wenn Sie Ihre Testng-Klasse direkt ausfรผhren, wird zuerst der Datenprovider aufgerufen, der keine Gruppeninformationen abrufen kann, da keine Gruppen verfรผgbar sind. Wenn Sie diese Klasse jedoch รผber testng.xml aufrufen, stehen ihr mit ITestContext Gruppeninformationen zur Verfรผgung. Verwenden Sie das folgende XML, um den Test aufzurufen

<!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>

Zusammenfassung

  • Parametrisierung ist erforderlich, um zu erstellen Datengesteuertes Testen.
  • TestNG Unterstรผtzt zwei Arten der Parametrisierung: @Parameter+TestNG. Xml und verwenden@Datenanbieter
  • In @Parameter+TestNG. Xml Parameter kรถnnen auf Suite-Ebene und Testebene platziert werden. Wenn

    An beiden Stellen wird derselbe Parametername deklariert; Der Teststufenparameter hat Vorrang vor dem Anzugstufenparameter.

  • mit @Parameter+TestNG.xml kann jeweils nur ein Wert festgelegt werden, aber @DataProvider gibt zurรผck ein 2D-Array von Object.
  • Wenn DataProvider in der anderen Klasse vorhanden ist, dann die Klasse, in der sich die Testmethode befindet.Datenanbieter sollte sein statische Methode.
  • Es gibt zwei Parameter, die von unterstรผtzt werden Datenanbieter Diese Methodik , ITestContext.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: