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.

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:
- Mit Hilfe der Parameterannotation und der TestNG XML Datei.
- Mit Hilfe der Datenanbieter Anmerkung.
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
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.
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)
Parameter kรถnnen auf zwei Ebenen definiert werden:
- Suite-Ebene โ die Parameter innerhalb der
<suite>Tag des TestNG Die XML-Datei enthรคlt Suite-Parameter. - Testlevel โ die Parameter innerhalb der
<test>Tag des TestNG Die XML-Datei enthรคlt Testparameter.
Hier ist derselbe Test mit Parametern auf Suite-Ebene:
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.
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:
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.
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.
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.
Vollstรคndiges Beispiel
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.
Code Beispiel
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.
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:
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.
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.
- Fรผge die Abhรคngigkeit hinzu. Umfassen
org.apache.poi:poi-ooxmlin Ihrem Maven oder Gradle bauen. DerooxmlDas Artefakt verarbeitet das .xlsx-Format; einfachpoiKann nur รคltere .xls-Dateien lesen. - 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.
- 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.
- 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.
















