Datenanbieter & TestNG XML: Parametrisierung in Selenium(Beispiel)
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
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
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
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)
Nun kรถnnen Parameter auf 2 Ebenen definiert werden
- Suite-Ebene โ Die Parameter innerhalb der Tag von TestNG Die XML-Datei ist ein Parameter auf Suite-Ebene.
- Testebene โ Die Parameter innerhalb der Das Tag der XML-Testdatei ist ein Teststufenparameter.
Hier ist derselbe Test mit Parametern auf Suite-Ebene
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.
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
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.
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.
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.
Vollstรคndiges Beispiel
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.
Code Beispiel
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โ.
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
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.
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.
















