DataProvider in TestNG: Selenium Parametrisierungsbeispiel

โšก Intelligente Zusammenfassung

Parametrierung in Selenium fรผhrt eine einzelne Testmethode wiederholt gegen verschiedene Datensรคtze aus und wandelt so ein Skript in eine datengesteuerte Testabdeckung um. TestNG bietet hierfรผr zwei Mechanismen: die @Parameters-Annotation, die von testng.xml unterstรผtzt wird, und die @DataProvider-Annotation, die ein zweidimensionales Objekt-Array zurรผckgibt.

  • ๐ŸŽฏ Hauptzweck: Durch die Parametrisierung werden fest codierte Werte aus den Testskripten entfernt, sodass dieselbe Logik jede Eingabekombination validiert, die die Anwendung unterstรผtzen muss.
  • ๐Ÿ“„ XML-Mechanismus: Die @Parameters-Annotation liest Name-Wert-Paare, die in testng.xml deklariert sind. Dies eignet sich fรผr Eingaben im Konfigurationsstil, bei denen die Anzahl der Kombinationen gering bleibt.
  • ๐Ÿท๏ธ Geltungsbereich Prioritรคt: Auf Testebene deklarierte Parameter รผberschreiben gleichnamige Parameter auf Suiteebene, wรคhrend Klassen auรŸerhalb dieses Tests weiterhin den Suite-Wert lesen.
  • ๐Ÿ—‚๏ธ Datenbereitstellungsmechanismus: Eine mit @DataProvider annotierte Methode gibt ein Object[][] zurรผck, und TestNG Der Test wird einmal pro Zeile ausgefรผhrt, wobei jede Spalte als Argument รผbergeben wird.
  • ๐Ÿ”— Externe Anbieter: Durch die Kennzeichnung des Providers als statisch und die Festlegung von dataProviderClass in @Test kรถnnen mehrere Testklassen eine gemeinsame Datenquelle nutzen.
  • ๐Ÿงญ Dynamische Datensรคtze: Die Annahme von Method oder ITestContext als Provider-Argument liefert unterschiedliche Daten pro Testmethode bzw. pro einbezogener Gruppe.
  • ๐Ÿ›ก๏ธ Hรคufige Fehler: Die meisten Annotationsfehler entstehen durch Typenkonflikte zwischen XML-Werten und Methodenargumenten sowie durch fehlende Parameter, die mit @Optional behoben werden.

DataProvider in TestNG

Bei der Softwareentwicklung ist es uns stets wichtig, dass die Software mit verschiedenen Datensรคtzen korrekt funktioniert. testing Es reicht nicht aus, dass diese Software nur einen einzelnen Datensatz prรผft. Wir mรผssen sicherstellen, dass das System jede erwartete Kombination akzeptiert. Dazu mรผssen wir unsere Testskripte parametrisieren. Hier kommt die Parametrisierung ins Spiel.

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 zu verdeutlichen, werden wir die Parametrisierungsoptionen in einem der beliebtesten Frameworks durchgehen. Selenium WebDriver โ€” TestNG.

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

  1. Mit Hilfe der Parameterannotation und der TestNG XML Datei.

Art der Parametrierung in TestNG

  1. Mit Hilfe der Datenanbieter Anmerkung.

Art der Parametrierung in TestNG

Art der Parametrierung in TestNG

Das obige Diagramm fasst die Aufteilung zusammen: Parameter aus testng.xml kรถnnen auf Suite- oder Testebene deklariert werden, wรคhrend ein Parameter aus einem DataProvider akzeptieren kann Method und ITestContext als eigenes Argument. Lasst uns sie im Detail untersuchen.

Parameteranmerkung in TestNG

Parameteranmerkung in TestNG Die Methode `@Parameters` dient dazu, Werte mithilfe einer XML-Datei als Argumente an Testmethoden zu รผbergeben. Benutzer mรผssen diese Werte unter Umstรคnden zur Laufzeit an die Testmethoden รผbergeben. Die Annotation `@Parameters` kann in jeder Methode verwendet werden, die mit `@Test`, `@Before`, `@After` oder `@Factory` annotiert ist.

Parameterannotation mit Testng.xml

Wรคhlen Sie die Parametrisierung mittels Annotationen, wenn Sie sich nicht mit Komplexitรคt auseinandersetzen mรถchten und die Anzahl der Eingabekombinationen gering ist.

Lassen Sie uns sehen, wie das funktioniert.

Testszenario

Schritt 1) Starten Sie den Browser und gehen Sie zu Google.com โ‚ฌXNUMX

Schritt 2) Geben Sie ein Suchwort ein

Parameterannotation mit Testng.Xml

Schritt 3) รœberprรผfen Sie, ob der eingegebene Wert mit dem Wert unserer Testdaten รผbereinstimmt.

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

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

Hier ist ein Beispiel, wie es geht. ohne Parameter:

package parameters;

import org.testng.annotations.Test;
import org.testng.AssertJUnit;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class NoParameterWithTestNGXML {
    WebDriver driver;

    @Test
    public void testNoParameter() throws InterruptedException {
        String author = "guru99";
        String searchKey = "india";

        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

        driver.get("https://google.com");
        WebElement searchText = driver.findElement(By.name("q"));
        // Searching text in the Google text box
        searchText.sendKeys(searchKey);

        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = " + searchText.getDomProperty("value")
                + " ::: Value given by input = " + searchKey);
        // Verifying the value in the Google search box
        AssertJUnit.assertTrue(searchText.getDomProperty("value").equalsIgnoreCase(searchKey));
    }
}

โš ๏ธ Selenium Anmerkung fรผr 4: Drei Zeilen in der ursprรผnglichen Version dieses Beispiels lassen sich nicht mehr kompilieren oder sind auf der aktuellen Version veraltet. Selenium Verรถffentlicht. System.setProperty("webdriver.gecko.driver", โ€ฆ) ist unnรถtig von Selenium 4.6 ff. Selenium Der Manager lรถst die Treiberdatei automatisch auf. implicitlyWait(10, TimeUnit.SECONDS) Die รœberlastung wurde beseitigt in Selenium 4 und ersetzt durch implicitlyWait(Duration.ofSeconds(10)). getAttribute() wurde als veraltet markiert in Selenium 4.27, also verwendet das Lesen eines Textfelds getDomProperty("value")In allen folgenden Beispielen werden die gleichen drei Korrekturen angewendet.

Betrachten Sie das obige Beispiel und stellen Sie sich vor, wie komplex der Code wird, wenn dies fรผr drei Eingabekombinationen wiederholt wird.

Nun parametrisieren wir es mit TestNGDazu 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 "https://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.time.Duration;

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 {
    WebDriver driver;

    @Test
    @Parameters({"author", "searchKey"})
    public void testParameterWithXML(@Optional("Abc") String author, String searchKey)
            throws InterruptedException {

        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");

        WebElement searchText = driver.findElement(By.name("q"));
        // Searching text in the Google text box
        searchText.sendKeys(searchKey);

        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = " + searchText.getDomProperty("value")
                + " ::: Value given by input = " + searchKey);
        // Verifying the value in the Google search box
        AssertJUnit.assertTrue(searchText.getDomProperty("value").equalsIgnoreCase(searchKey));
    }
}

Um das Skript auszufรผhren, wรคhlen Sie die XML-Datei aus und fรผhren Sie sie als aus TestNG Suite.

Rechtsklick auf die .xml-Datei -> Ausfรผhren als -> TestNG Suite (Hinweis: Suite)

ParameterWithTestNGXML.java-Datei

Parameter kรถnnen auf zwei Ebenen definiert werden:

  1. Suite-Ebene โ€” die Parameter innerhalb der <suite> Tag des TestNG Die XML-Datei enthรคlt Suite-Parameter.
  2. Testlevel โ€” die Parameter innerhalb der <test> Tag des TestNG Die XML-Datei enthรคlt Testparameter.

Hier ist derselbe Test mit Parametern auf Suite-Ebene:

ParameterWithTestNGXML.java-Datei

Anmerkungen: Wenn der Parametername auf Suite- und Testebene identisch ist, hat der Parameter auf Testebene Vorrang vor dem auf Suiteebene. In diesem Fall verwenden alle Klassen innerhalb dieser Testebene den รผberschriebenen Parameter, wรคhrend Klassen auรŸerhalb dieser Testebene weiterhin den Parameter auf Suiteebene verwenden.

ParameterWithTestNGXML.java-Datei

Problemlรถsung

Fehler 1: Ein Parameterwert in testng.xml, der nicht in den entsprechenden Parameter der Testmethode umgewandelt werden kann, fรผhrt zu einem Fehler.

Betrachten Sie das folgende Beispiel:

Fehlerbehebung

Hier entspricht das Attribut โ€žAutorโ€œ dem Wert โ€žโ€ฆโ€œ.Guru99', was ein String ist, wรคhrend die entsprechende Testmethode einen ganzzahligen Wert erwartet, wird eine Ausnahme ausgelรถst.

Fehler 2: Ihre @Parameters haben keinen entsprechenden Wert in testng.xml.

Das lรคsst sich lรถsen, indem man Folgendes hinzufรผgt: @Optionale Annotation dem entsprechenden Parameter in der Testmethode.

Fehlerbehebung

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

Die einfache Antwort lautet: Nein, das ist nicht mรถglich. Sie kรถnnen zwar mehrere verschiedene Parameter haben, aber jeder Parameter kann nur einen einzigen Wert annehmen. Dadurch wird verhindert, dass Werte fest im Skript codiert werden, und der Code bleibt wiederverwendbar โ€“ betrachten Sie es als Konfigurationsdatei fรผr Ihr Skript. Wenn Sie mehrere Werte fรผr einen Parameter benรถtigen, verwenden Sie stattdessen einen DataProvider.

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 Komplexe Objekte, Objekte aus Eigenschaftsdateien oder Objekte aus einer Datenbank kรถnnen รผber die Datenanbietermethode รผbergeben werden. Die Methode ist mit @DataProvider annotiert und gibt ein Array von Objekten zurรผck.

Parameter mit Dataprovider

Die @Parameters-Annotation ist einfach, aber um mit mehreren Datensรคtzen zu testen, benรถtigen wir einen Datenanbieter.

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

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

Parameter mit Datenprovider

Es hat nur einen Attribut, 'Name'Wenn Sie das Namensattribut nicht angeben, entspricht der Name des DataProviders dem Namen der entsprechenden Methode.

Ein Datenanbieter meldet eine zweidimensionale Java Objekt Die Testmethode wird M-mal fรผr ein Mร—N-Objektarray aufgerufen. Gibt der DataProvider beispielsweise ein 2ร—3-Objektarray zurรผck, wird der entsprechende Testfall zweimal mit jeweils drei Parametern aufgerufen.

Parameter mit Datenprovider

Vollstรคndiges Beispiel

Parameter mit Datenprovider

package parameters;

import java.time.Duration;

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;

    @BeforeTest
    public void setup() {
        // Create the Firefox driver object
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    /** Test case to verify the Google search box */
    @Test(dataProvider = "SearchProvider")
    public void testMethod(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        // Search value in the Google search box
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        // Verify if the value in the Google search box is correct
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /**
     * @return Object[][] where the first column contains 'author'
     * and the 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 ein DataProvider in derselben Klasse wie die Testmethode oder in deren Basisklasse. Um ihn in einer anderen Klasse zu platzieren, muss die DataProvider-Methode entsprechend angepasst werden. statisch und fรผgen Sie das Attribut hinzu dataProviderClass zu den @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.time.Duration;
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;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        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 the Google text box
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        // Get text from the search box
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        // Verify if the search box has the 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

Die DataProvider-Methode unterstรผtzt zwei Arten von Parametern.

Methodik โ€” wenn die gleich Der DataProvider sollte sich fรผr verschiedene Testmethoden unterschiedlich verhalten; verwenden Sie dazu den Parameter Method.

Arten von Parametern im Datenanbieter

Im folgenden Beispiel:

  • Wir prรผfen, ob der Methodenname testMethodA lautet.
  • Falls ja, gib einen Satz von Werten zurรผck.
  • Andernfalls wird ein anderer Satz von Werten zurรผckgegeben.
package parameters;

import java.lang.reflect.Method;
import java.time.Duration;
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;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    @Test(dataProvider = "SearchProvider")
    public void testMethodA(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        // Print author and search string
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    @Test(dataProvider = "SearchProvider")
    public void testMethodB(String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        // Print only the search string
        System.out.println("Welcome ->Unknown user Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /** The DataProvider returns values based on the test method name */
    @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 โ€” Dies kann verwendet werden, um unterschiedliche Parameter fรผr Testfรคlle basierend auf Gruppen zu erstellen.

In der Praxis kรถnnen Sie ITestContext verwenden, um Parameterwerte basierend auf Testmethoden, Hosts oder Testkonfigurationen zu variieren.

Arten von Parametern im Datenanbieter

Im folgenden Codebeispiel:

  • Wir haben zwei Gruppen, A und B.
  • Jede Prรผfmethode ist einer Gruppe zugeordnet
  • Wenn der Gruppenwert A ist, wird ein Datensatz zurรผckgegeben.
  • Wenn der Gruppenwert B ist, wird ein anderer Datensatz zurรผckgegeben.
package parameters;

import java.time.Duration;
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;

    @BeforeTest(groups = {"A", "B"})
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    @Test(dataProvider = "SearchProvider", groups = "A")
    public void testMethodA(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    @Test(dataProvider = "SearchProvider", groups = "B")
    public void testMethodB(String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->Unknown user Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /** The DataProvider supplies an Object array based on ITestContext */
    @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 die TestNG Wird die Klasse direkt aufgerufen, ruft sie zunรคchst den Datenanbieter auf. Dieser kann die Gruppeninformationen jedoch nicht lesen, da die Gruppen noch nicht verfรผgbar sind. Durch den Aufruf der Klasse รผber testng.xml werden die Gruppeninformationen รผber ITestContext verfรผgbar gemacht. Verwenden Sie das folgende XML, um den Test auszufรผhren:

<!DOCTYPE suite SYSTEM "https://testng.org/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>

Beide Mechanismen sind nun behandelt, die praktische Frage ist also, welchen man anwenden sollte.

@Parameters vs @DataProvider: Welches sollte man verwenden?

Die beiden Ansรคtze sind nicht austauschbar. Die Entscheidung hรคngt letztendlich davon ab, wie viele Wertekombinationen ein Test benรถtigt und woher diese Werte stammen.

Kriterium @Parameters + testng.xml @Datenanbieter
Werte pro Parameter Genau eins Unbegrenzte Zeilen
Datenquelle Statischer Text in der XML-Datei Java Code, Excel, CSV, Datenbank, API
Unterstรผtzte Typen Werte werden vom Typ String umgewandelt Jedes Java Objekt
Testaufrufe Einmal pro Konfiguration Einmal pro Datenzeile
Die ร„nderung von Daten erfordert Bearbeiten der XML-Datei Die Bearbeitung des Quellcodes erfordert oft keine Neukompilierung.
am besten geeignet fรผr Umgebungs- und Konfigurationswerte wie Browser, URL, Anmeldeinformationen Datengetriebenes Testen รผber viele Eingabekombinationen hinweg

In der Praxis verwenden die meisten Testsuiten beides: @Parameters enthรคlt die Umgebungseinstellungen, die wรคhrend eines Testlaufs konstant bleiben, und @DataProvider liefert die variierenden Geschรคftsdaten. Wenn der Datensatz zu groรŸ fรผr ein fest codiertes Array wird, werden die Daten im nรคchsten Schritt aus einer Tabellenkalkulation eingelesen.

Wie man Testdaten aus einer Excel-Datei mit DataProvider liest

Fest codierte Arrays skalieren nicht mehr, sobald Tester, die nicht schreiben Java Die Daten mรผssen gepflegt werden. Durch das รœbertragen der Zeilen in eine Tabellenkalkulation werden Testdaten von der Testlogik getrennt, was die praktische Form von datengetriebenes TestenApache POI liest die Arbeitsmappe, und der DataProvider wandelt jede Zeile in einen Testaufruf um.

  1. Fรผge die Abhรคngigkeit hinzu. Umfassen org.apache.poi:poi-ooxml in Ihrem Maven oder Gradle bauen. Der ooxml Das Artefakt verarbeitet das .xlsx-Format; einfach poi Kann nur รคltere .xls-Dateien lesen.
  2. Erstellen Sie die Arbeitsmappe. Platzieren Sie die Kopfzeile in Zeile 0 und darunter jeweils einen Testfall pro Zeile, wobei jede Spalte einem Argument der Testmethode entspricht.
  3. Lies das Tabellenblatt in ein Array ein. Die GrรถรŸe des Object[][] wird anhand der Zeilen- und Zellenanzahl so angepasst, dass neue Zeilen ohne Codeรคnderungen erfasst werden.
  4. Senden Sie es vom Anbieter zurรผck. Die Signatur der Testmethode bleibt genau unverรคndert.
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.DataProvider;

public class ExcelDataProvider {

    @DataProvider(name = "SearchProvider")
    public Object[][] readSearchData() throws Exception {
        FileInputStream file = new FileInputStream("src/test/resources/testdata.xlsx");
        Workbook workbook = new XSSFWorkbook(file);
        Sheet sheet = workbook.getSheetAt(0);

        // Skip the header row, so subtract one from the physical row count
        int rows = sheet.getLastRowNum();
        int cols = sheet.getRow(0).getPhysicalNumberOfCells();
        Object[][] data = new Object[rows][cols];

        for (int i = 1; i <= rows; i++) {
            for (int j = 0; j < cols; j++) {
                data[i - 1][j] = sheet.getRow(i).getCell(j).getStringCellValue();
            }
        }
        workbook.close();
        file.close();
        return data;
    }
}

๐Ÿ’ก Tipp: Telefon getStringCellValue() Nur bei Zellen, die als Text formatiert sind. Eine numerische Zelle lรถst einen Fehler aus. IllegalStateExceptionDies ist der hรคufigste Fehler, wenn eine Tabellenkalkulation IDs oder Betrรคge enthรคlt. Verwenden Sie eine DataFormatter jeden Zelltyp als Zeichenkette lesen oder einschalten cell.getCellType() und explizit konvertieren.

Da die Daten extern gespeichert werden, wird das Hinzufรผgen von hundert weiteren Testfรคllen zu einer einfachen Tabellenkalkulation anstatt einer Codeรคnderung, und derselbe Anbieter kann mehrere Testklassen durch den Prozess leiten. dataProviderClass Das zuvor gezeigte Attribut.

Hรคufig gestellte Fragen

Ja. Einstellung @DataProvider(name="x", parallel=true) Die Zeilen werden parallel ausgefรผhrt. Jeder Thread benรถtigt eine eigene WebDriver-Instanz. Speichern Sie den Treiber daher in einem ThreadLocal, da sich die Tests sonst gegenseitig beeintrรคchtigen.

Ja. TestNG akzeptiert Iterator<Object[]>Diese Methode liefert die Zeilen verzรถgert, anstatt das gesamte Array im Speicher aufzubauen. Sie eignet sich fรผr sehr groรŸe Datensรคtze oder Zeilen, die von einem Datenbankcursor gestreamt werden.

Ja. AI Aus einer Feldspezifikation generieren die Tools Grenzwerte, ungรผltige Eingaben und realistische synthetische Datensรคtze. RevPrรผfen Sie die Ausgabe auf Duplikate und vergewissern Sie sich, dass die erwarteten Ergebnisse korrekt sind, bevor Sie Zeilen zum Provider hinzufรผgen.

KI-Assistenten kennzeichnen redundante Datenzeilen, die denselben Codepfad ausfรผhren, gruppieren Fehler anhand gemeinsamer Eingabemerkmale und schlagen Selbstheilung vor. Locators wenn sich das Anwendungs-Markup รคndert.

Werte in testng.xml werden immer als Text gelesen. TestNG Die Konvertierung in den deklarierten Argumenttyp fรผhrt zu einem Fehler, wenn ein nicht-numerischer Wert an ein int-Argument gebunden ist. Vergleichen Sie den XML-Wert mit der Methodensignatur oder akzeptieren Sie einen String und analysieren Sie ihn.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: