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 |
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 „Autor“ gleich „Guru99“, einem String, und in der entsprechenden Testmethode wird ein ganzzahliger Wert erwartet, sodass wir hier eine Ausnahme erhalten.
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.
Codebeispiel
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.
Methode- 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 sind Methode und ITestContext.