Wenn wir Software erstellen, wünschen wir uns immer, dass sie mit einem anderen Datensatz anders funktioniert. Wenn es darum geht, dieselbe Software zu testen, können wir nicht unfair sein, sie mit nur einem Datensatz zu testen. Auch hier müssen wir überprüfen, ob unser System alle Kombinationen verwendet, die voraussichtlich unterstützt werden. Dazu müssen wir unsere Testskripte parametrisieren. Hier kommt die Parametrierung im Bild.
Parametrierung in Selen
Die Parametrisierung in Selen 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 als datengesteuertes Testen bezeichnet .
In diesem Tutorial lernen Sie:
- Art der Parametrierung in TestNG-
- Parameter Annotation mit Testng.xml
- Fehlerbehebung
- Parameter mit Dataprovider
- Rufen Sie DataProvider aus einer anderen Klasse auf
- Arten von Parametern in Dataprovider
Art der Parametrierung in TestNG-
Um die Parametrisierung klarer zu gestalten, werden wir die Parametrisierungsoptionen in einem der beliebtesten Frameworks für Selenium Webdriver - TestNG - durchgehen .
Es gibt zwei Möglichkeiten, wie wir in TestNG eine Parametrisierung erreichen können
- Mit Hilfe von Parameter Annotation und TestNG XML- Datei.
- Mit Hilfe der DataProvider- Annotation.
Parameter aus Testng.xml können Suite- oder Testebene sein
Parameter von DataProvider können Method und ITestContext als Parameter verwenden.
Lassen Sie uns sie im Detail studieren -
Parameter Annotation in TestNG
Parameter Annotation in TestNG ist eine Methode, mit der Werte als Argumente mithilfe der XML-Datei an die Testmethoden übergeben werden. Benutzer müssen die Werte möglicherweise zur Laufzeit an die Testmethoden übergeben. Die Annotationsmethode @Parameters kann in jeder Methode mit Annotation @Test, @Before, @After oder @Factory verwendet werden.
Parameter Annotation mit Testng.xml
Wählen Sie die Parametrisierung mithilfe von Anmerkungen aus, wenn Sie sich mit 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 ein Suchwort ein
Schritt 3) Stellen Sie sicher, dass der eingegebene Wert mit dem unserer Testdaten übereinstimmt
Schritt 4) Wiederholen Sie 2 und 3, bis alle Werte eingegeben sind
Testautor | SearchKey |
Guru99 | Indien |
Krishna | USA |
Bhupesh | China |
Hier ist ein Beispiel, wie es OHNE Parameter gemacht wird
Paketparameter;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;öffentliche Klasse NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";WebDriver-Treiber;@Prüfungpublic void testNoParameter () löst InterruptedException aus {String author = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Text in Google Textfeld suchensearchText.sendKeys (searchKey);System.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);System.out.println ("Thread wird jetzt schlafen");Thread.sleep (3000);System.out.println ("Wert im Google-Suchfeld =" + searchText.getAttribute ("Wert") + "::: Wert angegeben durch input =" + searchKey);// Überprüfen des Werts im Google-SuchfeldAssertJUnit.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 TestNG parametrisieren
Dazu müssen Sie
- Erstellen Sie eine XML-Datei, in der die Parameter gespeichert werden
- Fügen Sie im Test die Anmerkung @Parameters hinzu
Hier ist der vollständige Code
Test Level TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>class> class> test> suite>
ParameterWithTestNGXML.java-Datei
Paketparameter;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;öffentliche Klasse ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";WebDriver-Treiber;@Prüfung@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) löst InterruptedException aus {System.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Text in Google Textfeld suchensearchText.sendKeys (searchKey);System.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);System.out.println ("Thread wird jetzt schlafen");Thread.sleep (3000);System.out.println ("Wert im Google-Suchfeld =" + searchText.getAttribute ("Wert") + "::: Wert angegeben durch input =" + searchKey);// Überprüfen des Werts im Google-SuchfeldAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}}}
Anweisungen zum Ausführen des Skripts, wählen Sie die XML-Datei aus und führen Sie sie als Test NG Suite aus
Klicken Sie mit der rechten Maustaste auf die XML-Datei -> Ausführen als -> Testng Suite (Hinweis: Suite)
Jetzt können Parameter auf 2 Ebenen definiert werden
- Suite-Ebene - Die Parameter im
-Tag der TestNG-XML-Datei sind Parameter auf Suite-Ebene. - Testlevel - Die Parameter im
-Tag der XML-Testdatei sind ein Testlevel-Parameter.
Hier ist der gleiche Test mit Parametern auf Suite-Ebene
HINWEIS: Wenn der Parametername in Suite-Ebene und Test-Ebene identisch ist, wird der Parameter auf Test-Ebene gegenüber der Suite-Ebene bevorzugt. In diesem Fall teilen sich alle Klassen innerhalb dieser Testebene den überschriebenen Parameter, und andere Klassen, die sich außerhalb der Testebene befinden, teilen sich den Parameter der Suite-Ebene.
Fehlerbehebung
Problem Nr. 1 Der Parameterwert in testng.xml kann nicht in den Parameter der entsprechenden Testmethode typisiert werden, da dies einen Fehler auslöst.
Betrachten Sie das folgende Beispiel
Hier ist das Attribut 'author' gleich 'Guru99', eine Zeichenfolge, und in der entsprechenden Testmethode wird ein ganzzahliger Wert erwartet, sodass wir hier eine Ausnahme erhalten.
Problem Nr. 2 Ihre @Parameter haben keinen entsprechenden Wert in testing.xml.
Sie können diese Situation lösen, indem Sie @optional Annotation in den entsprechenden Parameter der Testmethode einfügen .
Problem Nr. 3: Sie möchten mehrere Werte desselben Parameters mit Testng.xml testen
Die einfache Antwort ist, dass dies nicht möglich ist! Sie können mehrere verschiedene Parameter haben, aber jeder Parameter kann nur einen einzigen Wert haben. Dies hilft, das Hardcodieren von Werten in das Skript zu verhindern. Dies macht Code wiederverwendbar. Stellen Sie sich das als Konfigurationsdateien für Ihr Skript vor. Wenn Sie mehrere Werte für einen Parameter verwenden möchten, verwenden Sie DataProviders
Datenprovider in TestNG
Der Datenprovider in TestNG ist eine Methode, die verwendet wird, wenn ein Benutzer komplexe Parameter übergeben muss. Komplexe Parameter müssen aus Java erstellt werden, z. B. komplexe Objekte. Objekte aus Eigenschaftendateien oder aus einer Datenbank können von der Datenprovider-Methode übergeben werden. Die Methode wird von @DataProvider mit Anmerkungen versehen und gibt ein Array von Objekten zurück.
Parameter mit Dataprovider
Die Annotation von @Parameters ist einfach, aber um mit mehreren Datensätzen zu testen, müssen wir den Datenprovider verwenden.
Um Tausende von Webformularen mit unserem Testframework auszufüllen, benötigen wir eine andere Methode, mit der wir einen sehr großen Datensatz in einem einzigen Ausführungsablauf erhalten.
Dieses datengesteuerte Konzept wird durch die Annotation @DataProvider in TestNG erreicht.
Es hat nur ein Attribut 'Name' . Wenn Sie das Namensattribut nicht angeben, stimmt der Name des DataProviders mit dem entsprechenden Methodennamen überein.
Der Datenprovider gibt ein zweidimensionales JAVA-Objekt an die Testmethode zurück, und die Testmethode ruft M-mal in einem Objektarray vom Typ M * N auf. Wenn der DataProvider beispielsweise ein Array von 2 * 3 Objekten zurückgibt, wird der entsprechende Testfall zweimal mit jeweils 3 Parametern aufgerufen.
Vollständiges Beispiel
Paketparameter;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;öffentliche Klasse ParameterByDataprovider {WebDriver-Treiber;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Firefox-Treiberobjekt erstellenSystem.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}}/ ** Testfall zur Überprüfung des Google-Suchfelds* @param author* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) löst InterruptedException aus {{WebElement searchText = driver.findElement (By.name ("q"));// Suchwert im Google-SuchfeldsearchText.sendKeys (searchKey);System.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);Thread.sleep (3000);String testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie, ob der Wert im Google-Suchfeld korrekt istAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}}}/ *** @return Object [] [] wobei die erste Spalte 'author' enthält* und zweite Spalte enthält 'searchKey'* /@DataProvider (name = "SearchProvider")öffentliches Objekt [] [] getDataFromDataprovider () {neues Objekt zurückgeben [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}}}
Rufen Sie DataProvider aus einer anderen Klasse auf
Standardmäßig befindet sich DataProvider in derselben Klasse, in der sich die Testmethode befindet, oder in ihrer Basisklasse. Um es in eine andere Klasse einzufügen, müssen wir die Datenprovider-Methode als statisch festlegen und in der Testmethode ein Attribut dataProviderClass in der @ Test- Annotation hinzufügen .
Codebeispiel
TestClass ParameterDataproviderWithClassLevel.java
Paketparameter;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;öffentliche Klasse ParameterDataproviderWithClassLevel {WebDriver-Treiber;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer 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) löst InterruptedException aus {WebElement searchText = driver.findElement (By.name ("q"));// Text in Google Textfeld suchensearchText.sendKeys (searchKey);System.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);Thread.sleep (3000);// Text aus Suchfeld abrufenString testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie, ob das Suchfeld den richtigen Wert hatAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}}}
DataproviderClass.java
Paketparameter;import org.testng.annotations.DataProvider;öffentliche Klasse DataproviderClass {@DataProvider (name = "SearchProvider")öffentliches statisches Objekt [] [] getDataFromDataprovider () {neues Objekt zurückgeben [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Arten von Parametern in Dataprovider
Es gibt zwei Arten von Parametern, die von der DataProvider-Methode unterstützt werden.
Methode - Wenn sich der SAME DataProvider bei verschiedenen Testmethoden unterschiedlich verhalten soll, verwenden Sie den Parameter Method.
Im folgenden Beispiel
- Wir prüfen, ob der Methodenname testMethodA ist.
- Wenn ja, geben Sie einen Wertesatz zurück
- Andernfalls wird ein anderer Wertesatz zurückgegeben
Paketparameter;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;öffentliche Klasse ParameterByMethodInDataprovider {WebDriver-Treiber;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) löst InterruptedException aus {WebElement searchText = driver.findElement (By.name ("q"));// Text im Suchfeld suchensearchText.sendKeys (searchKey);// Autor und Suchzeichenfolge druckenSystem.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);Thread.sleep (3000);String testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie, ob im Google-Textfeld der richtige Wert angezeigt wirdAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) löst InterruptedException aus {{WebElement searchText = driver.findElement (By.name ("q"));// Text im Suchfeld suchensearchText.sendKeys (searchKey);// Nur Suchzeichenfolge druckenSystem.out.println ("Willkommen -> Unbekannter Benutzer Ihr Suchschlüssel ist ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie, ob im Google-Textfeld der richtige Wert angezeigt wirdAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}}}/ *** Hier gibt DataProvider einen Wert basierend auf dem Namen der Testmethode zurück* @param m* @Rückkehr** /@DataProvider (name = "SearchProvider")öffentliches Objekt [] [] getDataFromDataprovider (Methode m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {neues Objekt zurückgeben [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}sonst{neues Objekt zurückgeben [] [] {{"Kanada"},{ "Russland" },{"Japan"}};}}}}}
Hier ist die Ausgabe
ITestContext - Hiermit können verschiedene Parameter für Testfälle basierend auf Gruppen erstellt werden.
In der Praxis können Sie ITestContext verwenden, um Parameterwerte basierend auf Testmethoden, Hosts und Testkonfigurationen zu variieren.
Im folgenden Codebeispiel
- Wir haben 2 Gruppen A & B.
- Jede Testmethode 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
Paketparameter;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;öffentliche Klasse ParameterByITestContextInDataprovider {WebDriver-Treiber;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groups = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);Treiber = neuer 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) löst InterruptedException aus {{// Google Textbox durchsuchenWebElement searchText = driver.findElement (By.name ("q"));// suche einen Wert daraufsearchText.sendKeys (searchKey);System.out.println ("Willkommen ->" + Autor + "Ihr Suchschlüssel ist ->" + Suchschlüssel);Thread.sleep (3000);String testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie den korrekten Wert im SuchfeldAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) löst InterruptedException aus {{// Google-Suchfeld findenWebElement searchText = driver.findElement (By.name ("q"));// suche einen Wert daraufsearchText.sendKeys (searchKey);System.out.println ("Willkommen -> Unbekannter Benutzer Ihr Suchschlüssel ist ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("Wert");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Überprüfen Sie den korrekten Wert im SuchfeldAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}}}/ *** Hier stellt der DAtaProvider ein Objektarray auf der Basis von ITestContext bereit* @param c* @Rückkehr* /@DataProvider (name = "SearchProvider")öffentliches Objekt [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;for (String-Gruppe: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = neues Objekt [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};brechen;}}sonst wenn (group.equalsIgnoreCase ("B")){groupArray = neues Objekt [] [] {{"Kanada"},{ "Russland" },{"Japan"}};}}brechen;}}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 Gruppeninformationen mit ITestContext zur Verfügung. Verwenden Sie das folgende XML, um den Test aufzurufen
run> group> class> test> run> group> class> test> suite>
Zusammenfassung :
- Die Parametrisierung ist erforderlich, um datengesteuerte Tests zu erstellen .
- TestNG unterstützt zwei Arten der Parametrisierung: @ Parameter + TestNG.xml und @DataProvider
- In @ Parameter + TestNG.xml können Parameter in Suite- und Testebene platziert werden. Wenn
Der gleiche Parametername wird an beiden Stellen deklariert. Der Testlevel-Parameter wird dem Anzug-Level-Parameter vorgezogen.
- Mit @ Parameter + TestNG.xml kann jeweils nur ein Wert festgelegt werden, aber @DataProvider gibt ein 2d-Array von Object zurück .
- Wenn DataProvider in der anderen Klasse als der Klasse vorhanden ist, in der sich die Testmethode befindet, sollte DataProvider eine statische Methode sein .
- Es gibt zwei Parameter unterstützt durch DataProvider- sind Verfahren und ITestContext.