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ı.

  • 🎯 Temel Amaç: Parametrelendirme, test komut dosyalarındaki sabit değerleri kaldırarak, uygulamanın desteklemesi gereken her giriş kombinasyonunun aynı mantıkla doğrulanmasını sağlar.
  • 📄 XML Mekanizması: @Parameters ek açıklaması, testng.xml dosyasında tanımlanan ad-değer çiftlerini okur; bu da kombinasyon sayısının az kaldığı yapılandırma tarzı girdiler için uygundur.
  • ???? ️ Kapsam Önceliği: Test seviyesinde tanımlanan parametreler, aynı ada sahip parametrelere sahip test paketi seviyesindeki parametreleri geçersiz kılar; ancak bu testin dışındaki sınıflar test paketindeki değeri okumaya devam eder.
  • 🗂️ Veri Sağlayıcı Mekanizması: @DataProvider ile işaretlenmiş bir metot Object[][] döndürür ve TestNG Her satır için testi bir kez çağırır ve her sütunu ayrı bir argüman olarak iletir.
  • 🔗 Harici Sağlayıcılar: Sağlayıcıyı statik olarak işaretlemek ve @Test üzerinde dataProviderClass'ı ayarlamak, birden fazla test sınıfının tek bir veri kaynağını paylaşmasına olanak tanır.
  • 🧭 Dinamik Veri Kümeleri: Sağlayıcı argümanı olarak Method veya ITestContext'i kabul etmek, her test yöntemi veya dahil edilen grup için farklı veriler döndürür.
  • 🛡️ Yaygın Arızalar: XML değerleri ve metot argümanları arasındaki tür uyuşmazlıkları ve @Optional ile çözülen eksik parametreler, ek açıklama hatalarının çoğuna neden olur.

Veri sağlayıcısında TestNG

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:

  1. Yardımı ile Parametre açıklaması ve TestNG XML dosyası.

Parametreleştirme Türü TestNG

  1. Yardımı ile Veri Sağlayıcı Ek açıklama.

Parametreleştirme Türü TestNG

Parametreleştirme Türü TestNG

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

Testng.Xml ile Parametre Açıklaması

) 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.

Testng.Xml ile Parametre Açıklaması

İş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)

Parametre İleTestNGXML.java Dosyası

Parametreler iki seviyede tanımlanabilir:

  1. Süit seviyesi — içindeki parametreler <suite> etiketi TestNG XML dosyaları, paket düzeyindeki parametrelerdir.
  2. Test seviyesi — içindeki parametreler <test> etiketi TestNG XML dosyaları test seviyesi parametreleridir.

İşte aynı testin paket düzeyindeki parametrelerle yapılmış hali:

Parametre İleTestNGXML.java Dosyası

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.

Parametre İleTestNGXML.java Dosyası

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:

Sorun giderme

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 giderme

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.

Dataprovider'ı Kullanan Parametreler

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.

Dataprovider'ı Kullanan Parametreler

Tam Örnek

Dataprovider'ı Kullanan Parametreler

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.

DataProvider'ı Farklı Sınıftan Çağır

Code Örnek E-posta

DataProvider'ı Farklı Sınıftan Çağır

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.

Dataprovider'daki Parametre Türleri

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ı:

Dataprovider'daki Parametre Türleri

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.

Dataprovider'daki Parametre Türleri

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.

  1. Bağımlılığı ekleyin. Dahil org.apache.poi:poi-ooxml Maven'ınızda veya Gradle yapı. bu ooxml Bu yapıt .xlsx formatını işler; düz poi Yalnızca eski .xls dosyalarını okur.
  2. Ç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.
  3. 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.
  4. Ü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.

SSS

Evet. Ayarlar @DataProvider(name="x", parallel=true) İşlem satırlarını eş zamanlı olarak yürütür. Her iş parçacığının kendi WebDriver örneğine ihtiyacı vardır, bu nedenle sürücüyü bir ThreadLocal'da saklayın, aksi takdirde testler birbirine müdahale eder.

Evet. TestNG kabul eder Iterator<Object[]>Bu yöntem, dizinin tamamını bellekte oluşturmak yerine satırları yavaş yavaş sağlar. Bu, çok büyük veri kümeleri veya veritabanı imlecinden akış halinde gelen satırlar için uygundur.

Evet. AI Bu araçlar, bir alan spesifikasyonundan sınır değerleri, geçersiz girdiler ve gerçekçi sentetik kayıtlar üretir. RevSağlayıcıya satır eklemeden önce, yinelenen kayıtlar için çıktıyı inceleyin ve beklenen sonuçların doğru olduğunu doğrulayın.

Yapay zekâ asistanları, aynı kod yolunu kullanan gereksiz veri satırlarını işaretler, hataları ortak girdi özelliklerine göre kümelendirir ve kendi kendini onarmayı önerir. bulucular Uygulama işaretlemesi değiştiğinde.

testng.xml dosyasındaki değerler her zaman metin olarak okunur. TestNG Bu işlem, değerleri belirtilen argüman türüne dönüştürür; bu nedenle, int argümanına bağlı sayısal olmayan bir değer başarısız olur. XML değerini yöntem imzasıyla eşleştirin veya bir String kabul edip ayrıştırın.

Bu yazıyı şu şekilde özetleyin: