Pružatelj podataka u TestNG: Selenium Primjer parametrizacije

⚡ Pametni sažetak

Parametriranje u Selenium ponavlja jednu metodu testiranja na različitim skupovima podataka, pretvarajući jedan skript u pokrivenost temeljenu na podacima. TestNG nudi dva mehanizma za to: anotaciju @Parameters koju podržava testng.xml i anotaciju @DataProvider koja vraća dvodimenzionalni niz objekata.

  • 🎯 Osnovna svrha: Parametrizacija uklanja čvrsto kodirane vrijednosti iz testnih skripti tako da ista logika validira svaku ulaznu kombinaciju koju aplikacija mora podržavati.
  • 📄 XML mehanizam: Anotacija @Parameters čita parove ime-vrijednost deklarirane u testng.xml, što odgovara ulazima u stilu konfiguracije gdje broj kombinacija ostaje mali.
  • 🏷️ Prioritet opsega: Parametri deklarirani na razini testa nadjačavaju identično imenovane parametre na razini paketa, dok klase izvan tog testa nastavljaju čitati vrijednost paketa.
  • 🗂️ Mehanizam pružatelja podataka: Metoda s oznakom @DataProvider vraća Object[][] i TestNG poziva test jednom po retku, prosljeđujući svaki stupac kao argument.
  • 🔗 Vanjski pružatelji usluga: Označavanje pružatelja kao statičkog i postavljanje dataProviderClass na @Test omogućuje nekoliko testnih klasa dijeljenje jednog izvora podataka.
  • 🧭 Dinamički skupovi podataka: Prihvaćanje Method ili ITestContext kao argumenta pružatelja vraća različite podatke po metodi testiranja ili po uključenoj grupi.
  • 🛡️ Uobičajeni kvarovi: Neusklađenosti tipova između XML vrijednosti i argumenata metode, te nedostajući parametri riješeni pomoću @Optional, uzrokuju većinu pogrešaka u anotacijama.

Pružatelj podataka u TestNG

Dok stvaramo softver, uvijek želimo da on ispravno radi s različitim skupovima podataka. Kada je u pitanju testiranje taj softver, provjera jednog skupa podataka nije dovoljna. Moramo provjeriti prihvaća li sustav svaku kombinaciju koju se očekuje da će podržavati. Za to moramo parametrizirati naše testne skripte. Tu dolazi do izražaja parametrizacija.

Parametriranje u Selenium

Parametriranje u Selenium je proces za parametrizaciju testnih skripti kako bi se proslijedilo više podataka aplikaciji tijekom izvođenja. To je strategija izvršenja koja automatski pokreće testne slučajeve više puta koristeći različite vrijednosti. Koncept postignut parametrizacijom testnih skripti naziva se Testiranje temeljeno na podacima.

Vrsta parametrizacije u TestNG

Kako bismo parametrizaciju učinili jasnijom, proći ćemo kroz opcije parametrizacije u jednom od najpopularnijih okvira za Selenium WebDriver — TestNG.

Postoje dva puta kojim možemo postići parametrizaciju u TestNG:

  1. Uz pomoć Anotacija parametara i TestNG XML file.

Vrsta parametrizacije u TestNG

  1. Uz pomoć DataProvider komentarima.

Vrsta parametrizacije u TestNG

Vrsta parametrizacije u TestNG

Gornji dijagram sažima podjelu: parametri iz testng.xml mogu se deklarirati na razini paketa ili testa, dok parametar iz DataProvidera može prihvatiti Method i ITestContext kao vlastiti argument. Proučimo ih detaljno.

Parametri Anotacija u TestNG

Parametri Anotacija u TestNG je metoda koja se koristi za prosljeđivanje vrijednosti metodama testiranja kao argumenata pomoću .xml datoteke. Korisnici mogu biti dužni proslijediti vrijednosti metodama testiranja tijekom izvođenja. Metoda anotacije @Parameters može se koristiti u bilo kojoj metodi koja ima anotaciju @Test, @Before, @After ili @Factory.

Bilješka parametara s Testng.xml

Odaberite parametrizaciju pomoću anotacija kada se ne želite baviti složenošću, a broj ulaznih kombinacija je mali.

Pogledajmo kako ovo funkcionira.

Testni scenarij

Korak 1) Pokrenite preglednik i idite na Google.com

Korak 2) Unesite ključnu riječ za pretraživanje

Napomena parametara s Testng.Xml

Korak 3) Provjerite je li unesena vrijednost ista kao vrijednost koju su dali naši testni podaci

Korak 4) Ponavljajte korake 2 i 3 dok ne unesete sve vrijednosti

Autor testa SearchKey
Guru99 Indija
Krishna SAD
Bhupesh Kina

Evo primjera kako to učiniti bez parametri:

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 Napomena iz 4.: Tri retka u izvornoj verziji ovog primjera više se ne kompiliraju ili su zastarjela na trenutnoj verziji Selenium tisak. System.setProperty("webdriver.gecko.driver", …) je nepotrebno od Selenium 4.6 nadalje jer Selenium Upravitelj automatski rješava binarni fajl upravljačkog programa. implicitlyWait(10, TimeUnit.SECONDS) preopterećenje je uklonjeno u Selenium 4 i zamijenjen s implicitlyWait(Duration.ofSeconds(10)). getAttribute() bio je zastario u Selenium 4.27, pa čitanje tekstnog okvira koristi getDomProperty("value")Svaki primjer u nastavku primjenjuje iste tri korekcije.

Proučite gornji primjer i zamislite koliko složen kod postaje kada se ovo ponovi za tri ulazne kombinacije.

Sada to parametrizirajmo koristeći TestNGDa biste to učinili, trebate:

  • Napravite XML datoteku koja će pohraniti parametre
  • U testu dodajte anotaciju @Parameters

Napomena parametara s Testng.Xml

Evo kompletnog koda.

Razina testa 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>

ParametarWithTestNGDatoteka XML.java

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));
    }
}

Za pokretanje skripte odaberite XML datoteku i pokrenite je kao TestNG o.

Desni klik na .xml datoteku -> Pokreni kao -> TestNG Apartman (Napomena: Apartman)

ParametarWithTestNGDatoteka XML.java

Parametri se mogu definirati na dvije razine:

  1. Razina apartmana — parametri unutar <suite> oznaka od TestNG XML datoteka su parametri na razini paketa.
  2. Razina testa — parametri unutar <test> oznaka od TestNG XML datoteka su parametri na razini testiranja.

Evo istog testa s parametrima na razini paketa:

ParametarWithTestNGDatoteka XML.java

NAPOMENA: Ako je naziv parametra isti na razini paketa i razini testiranja, parametar razine testiranja ima prednost pred parametrom razine paketa jedan. U tom slučaju, sve klase unutar te razine testiranja dijele nadjačani parametar, a klase izvan te razine testiranja nastavljaju koristiti parametar razine paketa.

ParametarWithTestNGDatoteka XML.java

Rješavanje problema

Izdanje # 1: Vrijednost parametra u testng.xml koja se ne može pretvoriti u parametar odgovarajuće metode testiranja izbacuje grešku.

Razmotrimo sljedeći primjer:

Rješavanje problema

Ovdje je atribut 'autor' jednak 'Guru99', što je niz znakova, dok odgovarajuća metoda testiranja očekuje cjelobrojnu vrijednost, pa se generira iznimka.

Izdanje # 2: Vaši @Parameters nemaju odgovarajuću vrijednost u testng.xml.

To možete riješiti dodavanjem @Dodatna napomena odgovarajućem parametru u metodi ispitivanja.

Rješavanje problema

Izdanje # 3: Želite testirati više vrijednosti istog parametra pomoću testng.xml.

Jednostavan odgovor je da se to ne može učiniti. Možete imati više različitih parametara, ali svaki parametar može sadržavati samo jednu vrijednost. To sprječava tvrdo kodiranje vrijednosti u skriptu i omogućuje ponovnu upotrebu koda - zamislite to kao konfiguracijsku datoteku za svoju skriptu. Ako vam je potrebno više vrijednosti za jedan parametar, umjesto toga upotrijebite DataProvider.

Davatelj podataka u TestNG

Davatelj podataka u TestNG je metoda koja se koristi kada korisnik treba proslijediti složene parametre. Složeni parametri moraju se stvoriti iz Java — složeni objekti, objekti iz datoteka svojstava ili objekti iz baze podataka mogu se proslijediti metodom pružatelja podataka. Metoda je označena s @DataProvider i vraća niz objekata.

Parametri koji koriste Dataprovider

Anotacija @Parameters je jednostavna, ali za testiranje s više skupova podataka moramo koristiti pružatelja podataka.

Za popunjavanje tisuća web obrazaca pomoću našeg okvira za testiranje, potrebna nam je drugačija metodologija koja može pružiti vrlo velik skup podataka u jednom tijeku izvršavanja.

Ovaj koncept vođen podacima postiže se @DataProvider anotacija u TestNG.

Parametri koji koriste Dataprovider

Ima samo jedan atribut, 'ime'Ako ne navedete atribut name, naziv DataProvidera je isti kao i naziv odgovarajuće metode.

Davatelj podataka vraća dvodimenzionalni Java objekt metodi testiranja, a metoda testiranja se poziva M puta za niz objekata veličine M×N. Na primjer, ako DataProvider vraća niz od 2×3 objekata, odgovarajući testni slučaj se poziva 2 puta s 3 parametra svaki put.

Parametri koji koriste Dataprovider

Kompletan primjer

Parametri koji koriste Dataprovider

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" }
        };
    }
}

Pozvati DataProvider iz druge klase

Prema zadanim postavkama, DataProvider se nalazi u istoj klasi kao i testna metoda ili u svojoj osnovnoj klasi. Da biste ga smjestili u drugu klasu, učinite metodu pružatelja podataka statički i dodajte atribut DataProviderClass prema @Test komentarima.

Pozovi DataProvider iz druge klase

Code Primjer

Pozovi DataProvider iz druge klase

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" }
        };
    }
}

Vrste parametara u Dataprovideru

Metoda DataProvider podržava dvije vrste parametara.

način — ako se isti DataProvider bi se trebao ponašati drugačije za različite metode testiranja, koristite parametar Method.

Vrste parametara u Dataprovideru

U sljedećem primjeru:

  • Provjeravamo je li naziv metode testMethodA
  • Ako je odgovor da, vratite jedan skup vrijednosti
  • Inače vrati drugi skup vrijednosti
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" }
            };
        }
    }
}

Evo rezultata:

Vrste parametara u Dataprovideru

ITestContext — ovo se može koristiti za stvaranje različitih parametara za testne slučajeve na temelju grupa.

U stvarnom životu, ITestContext možete koristiti za mijenjanje vrijednosti parametara na temelju metoda testiranja, hostova ili konfiguracija testiranja.

Vrste parametara u Dataprovideru

U sljedećem primjeru koda:

  • Imamo 2 grupe, A i B
  • Svaka metoda ispitivanja dodijeljena je skupini
  • Ako je vrijednost grupe A, vraća se jedan skup podataka
  • Ako je vrijednost grupe B, vraća se drugi skup podataka
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;
    }
}

Bilješka: Ako pokrenete TestNG klasa izravno, prvo poziva pružatelja podataka, a pružatelj ne može pročitati podatke o grupi jer grupe još nisu dostupne. Pozivanjem klase putem testng.xml podaci o grupi postaju dostupni putem ITestContext. Za pokretanje testa upotrijebite sljedeći XML:

<!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>

Oba mehanizma su sada pokrivena, pa je praktično pitanje koji odabrati.

@Parameters vs @DataProvider: Koji koristiti

Ta dva pristupa nisu zamjenjiva. Odluka se svodi na to koliko kombinacija vrijednosti je potrebno testu i odakle te vrijednosti potječu.

Kriterij @Parametri + testng.xml @DataProvider
Vrijednosti po parametru Točno jedan Neograničeni redovi
Izvor podataka Statički tekst u XML datoteci Java kod, Excel, CSV, baza podataka, API
Podržane vrste Vrijednosti pretvorene u tip iz niza znakova bilo koji Java objekt
Pozivanja testa Jednom po konfiguraciji Jednom po retku podataka
Promjena podataka zahtijeva Uređivanje XML datoteke Uređivanje izvornog koda, često bez ponovnog kompajliranja
Najprikladniji za Vrijednosti okruženja i konfiguracije kao što su preglednik, URL, vjerodajnice Testiranje vođeno podacima na mnogim ulaznim kombinacijama

U praksi većina paketa koristi oboje: @Parameters nosi postavke okruženja koje ostaju konstantne tijekom cijelog izvođenja, a @DataProvider pruža različite poslovne podatke. Kada skup podataka preraste fiksno kodirani niz, sljedeći korak je čitanje iz proračunske tablice.

Kako čitati testne podatke iz Excel datoteke pomoću DataProvidera

Tvrdo kodirani nizovi prestaju se skalirati nakon što testeri koji ne pišu Java potrebno je održavati podatke. Premještanje redaka u proračunsku tablicu odvaja testne podatke od testne logike, što je praktični oblik testiranje vođeno podacimaApache POI čita radnu knjigu, a DataProvider pretvara svaki redak u jedan testni poziv.

  1. Dodajte ovisnost. Uključivati org.apache.poi:poi-ooxml u vašem Mavenu ili Gradle graditi. The ooxml artefakt obrađuje .xlsx format; običan poi čita samo naslijeđene .xls datoteke.
  2. Izradite radnu knjigu. Stavite redak zaglavlja u redak 0 i jedan testni slučaj po retku ispod njega, s jednim stupcem po argumentu metode testiranja.
  3. Pročitajte list u niz. Odredite veličinu Objekta[][] prema broju redaka i ćelija tako da se novi retci preuzimaju bez promjena koda.
  4. Vratite ga od dobavljača. Potpis metode ispitivanja ostaje točno kao i prije.
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;
    }
}

💡 Savjet: poziv getStringCellValue() samo na ćelijama formatiranim kao tekst. Numerička ćelija baca IllegalStateException, što je najčešći kvar kada proračunska tablica sadrži ID-ove ili iznose. Koristite DataFormatter čitati svaku vrstu ćelije kao niz znakova ili uključiti cell.getCellType() i eksplicitno pretvoriti.

S eksternaliziranim podacima, dodavanje stotinu testnih slučajeva postaje uređivanje proračunske tablice, a ne promjena koda, a isti pružatelj usluga može hraniti nekoliko testnih klasa putem dataProviderClass atribut prikazan ranije.

Pitanja i odgovori

Da. Postavka @DataProvider(name="x", parallel=true) istovremeno izvršava retke. Svaka nit treba vlastitu instancu WebDrivera, stoga pohranite upravljački program u ThreadLocal, inače testovi međusobno ometaju.

Da. TestNG prihvaća Iterator<Object[]>, koji lijeno dostavlja retke umjesto da izgradi cijeli niz u memoriji. To odgovara vrlo velikim skupovima podataka ili retcima koji se struje iz kursora baze podataka.

Da. AI Alati generiraju granične vrijednosti, nevažeće ulaze i realistične sintetičke zapise iz specifikacije polja. RevPregledajte izlaz za duplikate i potvrdite da su očekivani rezultati točni prije dodavanja redaka pružatelju.

AI asistenti označavaju redundantne retke podataka koji koriste isti put koda, klasteriraju kvarove prema zajedničkim ulaznim karakteristikama i predlažu samoobnavljanje lokatori kada se promijeni označavanje aplikacije.

Vrijednosti u testng.xml se uvijek čitaju kao tekst. TestNG pretvara ih u deklarirani tip argumenta, tako da nenumerička vrijednost vezana za cijeli broj argumenta ne uspijeva. Usporedite XML vrijednost s potpisom metode ili prihvatite niz znakova i analizirajte ga.

Sažmite ovu objavu uz: