Veri sağlayıcısında TestNG: Selenium Parametrelendirme Örneği
⚡ Akıllı Özet
Parametreleştirme Selenium Tek bir test yöntemini farklı veri kümelerine karşı tekrar tekrar çalıştırarak, tek bir komut dosyasını veri odaklı kapsama aracına dönüştürür. TestNG Bu durum için iki mekanizma sunulmaktadır: testng.xml tarafından desteklenen @Parameters ek açıklaması ve iki boyutlu bir nesne dizisi döndüren @DataProvider ek açıklaması.

Yazılım geliştirirken, her zaman farklı veri kümeleriyle doğru şekilde çalışmasını isteriz. Söz konusu olduğunda... test yapmak Yazılımda tek bir veri kümesini kontrol etmek yeterli değildir. Sistemin desteklemesi beklenen her kombinasyonu kabul ettiğini doğrulamamız gerekir. Bunun için test komut dosyalarımızı parametreleştirmemiz gerekir. İşte burada parametreleştirme devreye giriyor.
Parametreleştirme Selenium
Parametreleştirme Selenium Çalışma zamanında uygulamaya birden fazla veri aktarmak için test komut dosyalarını parametreleştirmeye yönelik bir işlemdir. Farklı değerleri kullanarak test senaryolarını otomatik olarak birden çok kez çalıştıran bir yürütme stratejisidir. Test komut dosyalarının parametrelendirilmesiyle elde edilen konsepte denir. Veriye Dayalı Test.
Parametreleştirme Türü TestNG
Parametrelendirmeyi daha anlaşılır hale getirmek için, en popüler çerçevelerden birindeki parametrelendirme seçeneklerini inceleyeceğiz. Selenium WebDriver — TestNG.
Var iki yol bununla parametreleştirmeyi başarabiliriz TestNG:
- Yardımı ile Parametre açıklaması ve TestNG XML dosyası.
- Yardımı ile Veri Sağlayıcı Ek açıklama.
Yukarıdaki diyagram ayrımı özetliyor: testng.xml'deki parametreler suite veya test seviyesinde tanımlanabilirken, bir DataProvider'dan gelen bir parametre kabul edebilir. Method hem de ITestContext Kendi argümanı olarak ele alalım. Bunları detaylı olarak inceleyelim.
Parametre Açıklamaları TestNG
Parametre Açıklamaları TestNG `@Parameters` yöntemi, bir `.xml` dosyası kullanarak test yöntemlerine argüman olarak değerler iletmek için kullanılır. Kullanıcıların çalışma zamanında test yöntemlerine değerler iletmesi gerekebilir. `@Parameters` ek açıklama yöntemi, `@Test`, `@Before`, `@After` veya `@Factory` ek açıklamalarına sahip herhangi bir yöntemde kullanılabilir.
Testng.xml ile parametre açıklaması
Karmaşıklıkla uğraşmak istemediğinizde ve girdi kombinasyonlarının sayısı az olduğunda, ek açıklamalar kullanarak parametreleştirmeyi seçin.
Bunun nasıl çalıştığını görelim.
Test Senaryosu
) 1 Adım Tarayıcıyı başlatın ve şu adrese gidin: Google.com
) 2 Adım Bir arama anahtar kelimesi girin
) 3 Adım Girilen değerin, test verilerimiz tarafından sağlanan değerle aynı olduğunu doğrulayın.
) 4 Adım Tüm değerler girilene kadar 2. ve 3. adımları tekrarlayın.
| Test Yazarı | AramaAnahtarı |
|---|---|
| Guru99 | Hindistan |
| Krishna | ABD |
| Bhupesh | Çin |
İşte bunu nasıl yapacağınıza dair bir örnek. olmadan parametreleri:
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 4 notu: Bu örneğin orijinal sürümündeki üç satır artık derlenmiyor veya mevcut sürümde kullanımdan kaldırılmış durumda. Selenium bültenleri. System.setProperty("webdriver.gecko.driver", …) gereksizdir Selenium 4.6 ve sonrası çünkü Selenium Yönetici, sürücü ikili dosyasını otomatik olarak çözümler. implicitlyWait(10, TimeUnit.SECONDS) Aşırı yüklenme giderildi. Selenium 4 ve yerine şunlar geçti implicitlyWait(Duration.ofSeconds(10)). getAttribute() kullanım dışı bırakıldı Selenium 4.27, yani bir metin kutusunu okumak şu şekilde çalışır: getDomProperty("value")Aşağıdaki her örnekte aynı üç düzeltme uygulanmıştır.
Yukarıdaki örneği inceleyin ve bu işlemin üç farklı giriş kombinasyonu için tekrarlandığında kodun ne kadar karmaşık hale geldiğini hayal edin.
Şimdi bunu parametreleştirelim. TestNGBunu yapmak için şunları yapmanız gerekir:
- Parametreleri saklayacak bir XML dosyası oluşturun
- Teste @Parameters ek açıklamasını ekleyin.
İşte kodun tamamı.
Test Seviyesi 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>
Parametre İleTestNGXML.java Dosyası
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)); } }
Komut dosyasını çalıştırmak için XML dosyasını seçin ve çalıştırın. TestNG süit.
.xml dosyasına sağ tıklayın -> Farklı çalıştır -> TestNG Süit (Not: Süit)
Parametreler iki seviyede tanımlanabilir:
- Süit seviyesi — içindeki parametreler
<suite>etiketi TestNG XML dosyaları, paket düzeyindeki parametrelerdir. - Test seviyesi — içindeki parametreler
<test>etiketi TestNG XML dosyaları test seviyesi parametreleridir.
İşte aynı testin paket düzeyindeki parametrelerle yapılmış hali:
NOT: Eğer parametre adı hem test hem de uygulama paketi düzeyinde aynıysa, test düzeyindeki parametre uygulama paketi düzeyindeki parametreye göre öncelik kazanır. Bu durumda, o test düzeyindeki tüm sınıflar geçersiz kılınan parametreyi paylaşır ve o test düzeyinin dışındaki sınıflar uygulama paketi düzeyindeki parametreyi kullanmaya devam eder.
Sorun giderme
Sorun #1: testng.xml dosyasındaki bir parametre değeri, karşılık gelen test metodunun parametresine dönüştürülemiyorsa hata oluşur.
Aşağıdaki örneği düşünün:
Burada 'yazar' özniteliği 'Guru'99' bir dize (string) değeridir, oysa ilgili test yöntemi bir tamsayı değeri beklemektedir; bu nedenle bir istisna oluşur.
Sorun #2: @Parameters'larınızın testng.xml dosyasında karşılık gelen bir değeri yok.
Bunu ekleyerek çözebilirsiniz. @İsteğe bağlı açıklama Test yöntemindeki ilgili parametreye.
Sorun #3: testng.xml kullanarak aynı parametrenin birden fazla değerini test etmek istiyorsunuz.
Basitçe söylemek gerekirse, bu mümkün değil. Birden fazla farklı parametreniz olabilir, ancak her parametre yalnızca tek bir değer tutabilir. Bu, değerlerin betiğe sabit kodlanmasını önler ve kodun yeniden kullanılabilirliğini sağlar; bunu betiğiniz için bir yapılandırma dosyası olarak düşünün. Bir parametre için birden fazla değere ihtiyacınız varsa, bunun yerine bir Veri Sağlayıcı (DataProvider) kullanın.
Veri Sağlayıcı TestNG
Veri Sağlayıcı TestNG Kullanıcının karmaşık parametreler geçirmesi gerektiğinde kullanılan bir yöntemdir. Karmaşık parametreler şu şekilde oluşturulmalıdır: Java — Karmaşık nesneler, özellik dosyalarındaki nesneler veya veritabanındaki nesneler, veri sağlayıcı yöntemi aracılığıyla iletilebilir. Bu yöntem @DataProvider ek açıklamasıyla işaretlenmiştir ve bir nesne dizisi döndürür.
Dataprovider'ı kullanan parametreler
@Parameters ek açıklaması kolaydır, ancak birden fazla veri kümesiyle test yapmak için bir Veri Sağlayıcı kullanmamız gerekir.
Test çerçevemizi kullanarak binlerce web formunu doldurmak için, tek bir yürütme akışında çok büyük bir veri kümesi sağlayabilecek farklı bir metodolojiye ihtiyacımız var.
Bu veri odaklı kavram, şu şekilde elde edilir: @DataProvider ek açıklama TestNG.
Sadece bir tane var özellik, 'isim'Eğer `name` özelliğini belirtmezseniz, DataProvider'ın adı ilgili metodun adıyla aynı olur.
Bir veri sağlayıcısı geri döner. iki boyutlu Java nesne Test metoduna, M×N boyutunda bir nesne dizisi için M defa çağrılır. Örneğin, DataProvider 2×3 boyutunda bir nesne dizisi döndürürse, ilgili test durumu her seferinde 3 parametre ile 2 defa çağrılır.
Tam Örnek
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" } }; } }
Farklı sınıftan DataProvider'ı çağırın
Varsayılan olarak, bir DataProvider test metoduyla aynı sınıfta veya onun temel sınıfında bulunur. Başka bir sınıfa yerleştirmek için, veri sağlayıcı metodunu şu şekilde tanımlayın: statik ve özelliği ekleyin dataProviderClass için @Ölçek Ek açıklama.
Code Örnek E-posta
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" } }; } }
Dataprovider'daki Parametre Türleri
DataProvider yöntemi tarafından desteklenen iki tür parametre vardır.
Yöntem - Eğer aynı DataProvider, farklı test yöntemleri için farklı davranmalıdır; bunun için Method parametresini kullanın.
Aşağıdaki örnekte:
- Metot adının testMethodA olup olmadığını kontrol ediyoruz.
- Evet ise, bir değer kümesi döndürün.
- Aksi takdirde başka bir değer kümesi döndürün.
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" } }; } } }
İşte çıktı:
ITestContext — Bu özellik, gruplara göre test senaryoları için farklı parametreler oluşturmak amacıyla kullanılabilir.
Gerçek hayatta, ITestContext'i test yöntemlerine, sunuculara veya test yapılandırmalarına bağlı olarak parametre değerlerini değiştirmek için kullanabilirsiniz.
Aşağıdaki kod örneğinde:
- A ve B olmak üzere 2 grubumuz var.
- Her test yöntemi bir gruba atanır
- Grup değeri A ise, bir veri seti döndürülür.
- Grup değeri B ise, başka bir veri seti döndürülür.
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; } }
Not: çalıştırırsanız TestNG Doğrudan sınıfı çağırdığınızda, önce veri sağlayıcıyı çağırır ve sağlayıcı, gruplar henüz mevcut olmadığı için grup bilgilerini okuyamaz. Sınıfı testng.xml üzerinden çağırmak, grup bilgilerinin ITestContext aracılığıyla kullanılabilir olmasını sağlar. Testi çalıştırmak için aşağıdaki XML'i kullanın:
<!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>
Her iki mekanizma da ele alındı, bu nedenle pratik soru hangisine başvurulacağıdır.
@Parameters mı yoksa @DataProvider mı kullanılmalı: Hangisi tercih edilmeli?
Bu iki yaklaşım birbirinin yerine kullanılamaz. Karar, bir testin kaç değer kombinasyonuna ihtiyaç duyduğuna ve bu değerlerin nereden kaynaklandığına bağlıdır.
| Kriter | @Parameters + testng.xml | @DataProvider |
|---|---|---|
| Parametre başına değerler | tam olarak bir | Sınırsız satır |
| Veri kaynağı | XML dosyasındaki statik metin | Java kod, Excel, CSV, veritabanı, API |
| Desteklenen türler | String'den tür dönüştürme yoluyla elde edilen değerler | Farketmez Java nesne |
| Test çağrıları | Yapılandırma başına bir kez | Veri satırı başına bir kez |
| Verilerin değiştirilmesi şunları gerektirir: | XML dosyasını düzenleme | Kaynak kodu düzenlemek, genellikle yeniden derleme gerektirmez. |
| En uygun | Tarayıcı gibi ortam ve yapılandırma değerleri, URLkimlik bilgileri | Çeşitli girdi kombinasyonlarında veriye dayalı testler |
Pratikte çoğu test paketi ikisini de kullanır: @Parameters, çalıştırma boyunca sabit kalan ortam ayarlarını taşır ve @DataProvider ise değişen iş verilerini sağlar. Veri kümesi sabit kodlanmış bir diziyi aştığında, bir sonraki adım onu bir elektronik tablodan okumaktır.
DataProvider Kullanarak Excel Dosyasından Test Verilerini Nasıl Okuyabilirsiniz?
Kod içine sabit olarak yazılmış diziler, test edenler yazmadığı sürece ölçeklenmeyi bırakır. Java Verileri korumak gerekiyor. Satırları bir elektronik tabloya taşımak, test verilerini test mantığından ayırır; bu da pratik bir yöntemdir. veri odaklı testApache POI çalışma kitabını okur ve DataProvider her satırı bir test çağrısına dönüştürür.
- Bağımlılığı ekleyin. Dahil
org.apache.poi:poi-ooxmlMaven'ınızda veya Gradle yapı. buooxmlBu yapıt .xlsx formatını işler; düzpoiYalnızca eski .xls dosyalarını okur. - Çalışma kitabını oluşturun. Başlık satırını 0. satıra, altına da her satıra bir test senaryosu olacak şekilde, her test metodu argümanı için bir sütun olacak şekilde yerleştirin.
- Sayfayı bir diziye okuyun. Yeni satırların kodda değişiklik yapılmadan algılanabilmesi için, Object[][] dizisinin boyutunu satır ve hücre sayılarından belirleyin.
- Ürünü sağlayıcıdan iade edin. Test metodu imzası aynen eskisi gibi kalıyor.
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; } }
💡 İpucu: Çağrı getStringCellValue() Yalnızca metin olarak biçimlendirilmiş hücrelerde. Sayısal bir hücre hata verir. IllegalStateExceptionBu, bir elektronik tabloda kimlik numaraları veya tutarlar bulunduğunda en sık karşılaşılan hatadır. Bunun için şunu kullanın: DataFormatter Her hücre tipini bir Dize olarak okumak veya açmak için cell.getCellType() ve açıkça dönüştürün.
Verilerin dışarıya aktarılmasıyla, yüzlerce test senaryosu eklemek kod değişikliği yerine elektronik tablo düzenlemesi haline gelir ve aynı sağlayıcı birden fazla test sınıfını bu işlem üzerinden besleyebilir. dataProviderClass Daha önce gösterilen özellik.
















