Poskytovatel dat v TestNG: Selenium Příklad parametrizace

⚡ Chytré shrnutí

Parametrizace v Selenium opakovaně spouští jednu testovací metodu na různých datových sadách, čímž se jeden skript promění v pokrytí řízené daty. TestNG nabízí pro to dva mechanismy: anotaci @Parameters podpořenou souborem testng.xml a anotaci @DataProvider vracející dvourozměrné pole objektů.

  • 🎯 Hlavní účel: Parametrizace odstraňuje pevně zakódované hodnoty z testovacích skriptů, takže stejná logika ověřuje každou vstupní kombinaci, kterou aplikace musí podporovat.
  • 📄 Mechanismus XML: Anotace @Parameters čte páry název-hodnota deklarované v souboru testng.xml, což vyhovuje vstupům konfiguračního stylu, kde počet kombinací zůstává malý.
  • ???? ️ Priorita rozsahu: Parametry deklarované na úrovni testu přepíší identicky pojmenované parametry na úrovni sady, zatímco třídy mimo tento test nadále čtou hodnotu sady.
  • 🗂️ Mechanismus poskytovatele dat: Metoda s anotací @DataProvider vrací Object[][] a TestNG vyvolá test jednou za řádek a každý sloupec předá jako argument.
  • 🔗 Externí poskytovatelé: Označení poskytovatele jako statického a nastavení dataProviderClass na @Test umožňuje několika testovacím třídám sdílet jeden zdroj dat.
  • 🧭 Dynamické datové sady: Přijetí metody Method nebo ITestContext jako argumentu poskytovatele vrací různá data pro každou testovací metodu nebo pro každou zahrnutou skupinu.
  • 🛡️ Běžná selhání: Většinu chyb v anotacích způsobují neshody typů mezi hodnotami XML a argumenty metody a chybějící parametry řešené pomocí @Optional.

Poskytovatel dat v TestNG

Při tvorbě softwaru vždy chceme, aby správně fungoval s různými sadami dat. Pokud jde o Testování v tomto softwaru nestačí kontrola jediné sady dat. Musíme ověřit, zda systém akceptuje každou kombinaci, kterou má podporovat. K tomu musíme parametrizovat naše testovací skripty. A zde přichází na řadu parametrizace.

Parametrizace v Selenium

Parametrizace v Selenium je proces parametrizace testovacích skriptů za účelem předání více dat do aplikace za běhu. Je to strategie provádění, která automaticky spouští testovací případy vícekrát s použitím různých hodnot. Koncept dosažený parametrizací testovacích skriptů se nazývá Data řízené testování.

Typ parametrizace v TestNG

Pro lepší pochopení parametrizace si projdeme možnosti parametrizace v jednom z nejpopulárnějších frameworků pro... Selenium Webový ovladač — TestNG.

Existují dvě cesty pomocí kterého můžeme dosáhnout parametrizace v TestNG:

  1. S pomocí Anotace parametrů a TestNG XML soubor.

Typ parametrizace In TestNG

  1. S pomocí DataProvider anotace.

Typ parametrizace In TestNG

Typ parametrizace In TestNG

Výše uvedený diagram shrnuje rozdělení: parametry z testng.xml lze deklarovat na úrovni sady nebo testu, zatímco parametr z DataProvider může přijímat Method a ITestContext jako samostatný argument. Pojďme si je podrobněji prostudovat.

Parametry Anotace v TestNG

Parametry Anotace v TestNG je metoda používaná k předávání hodnot testovacím metodám jako argumentů pomocí souboru .xml. Uživatelé mohou být povinni předat hodnoty testovacím metodám během běhu. Anotační metodu @Parameters lze použít v jakékoli metodě s anotací @Test, @Before, @After nebo @Factory.

Anotace parametrů pomocí Testng.xml

Parametrizaci pomocí anotací zvolte, pokud se nechcete zabývat složitostí a počet vstupních kombinací je malý.

Podívejme se, jak to funguje.

Scénář testu

Krok 1) Spusťte prohlížeč a přejděte na Google.com

Krok 2) Zadejte klíčové slovo pro vyhledávání

Parametry Anotace S Testng.Xml

Krok 3) Ověřte, zda je zadaná hodnota stejná jako hodnota poskytnutá našimi testovacími daty.

Krok 4) Opakujte kroky 2 a 3, dokud nezadáte všechny hodnoty.

Autor testu SearchKey
Guru99 Indie
Krishna Spojené státy americké
Bhupesh Čína

Zde je příklad, jak to udělat bez parametry:

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 Poznámka z roku 4: Tři řádky v původní verzi tohoto příkladu se již nekompilují nebo jsou v aktuální verzi zastaralé. Selenium vydání. System.setProperty("webdriver.gecko.driver", …) je zbytečné z Selenium 4.6 a dále, protože Selenium Správce automaticky rozpozná binární soubor ovladače. implicitlyWait(10, TimeUnit.SECONDS) přetížení bylo odstraněno v Selenium 4 a nahrazeno implicitlyWait(Duration.ofSeconds(10)). getAttribute() byl zastaralý v roce Selenium 4.27, takže čtení textového pole používá getDomProperty("value")Každý níže uvedený příklad aplikuje stejné tři korekce.

Prostudujte si výše uvedený příklad a představte si, jak složitý se kód stane, když se to opakuje pro tři vstupní kombinace.

Nyní to parametrizujme pomocí TestNGK tomu je potřeba:

  • Vytvořte soubor XML, který bude ukládat parametry
  • V testu přidejte anotaci @Parameters

Parametry Anotace S Testng.Xml

Zde je kompletní kód.

Testovací úroveň 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>

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

Chcete-li spustit skript, vyberte soubor XML a spusťte ho jako TestNG apartmá.

Klikněte pravým tlačítkem myši na soubor .xml -> Spustit jako -> TestNG Apartmá (Poznámka: Apartmá)

ParametrSTestNGSoubor XML.java

Parametry lze definovat na dvou úrovních:

  1. Úroveň apartmá — parametry uvnitř <suite> štítek TestNG XML soubor je parametr na úrovni sady.
  2. Zkušební úroveň — parametry uvnitř <test> štítek TestNG XML soubor je parametrem na úrovni testování.

Zde je stejný test s parametry na úrovni sady:

ParametrSTestNGSoubor XML.java

POZNÁMKA: Pokud je název parametru na úrovni sady i na úrovni testu stejný, má parametr na úrovni testu přednost před parametrem na úrovni sady jedna. V takovém případě všechny třídy uvnitř dané úrovně testu sdílejí přepsaný parametr a třídy mimo danou úroveň testu nadále používají parametr na úrovni sady.

ParametrSTestNGSoubor XML.java

Odstraňování poruch

Problém č. 1: Hodnota parametru v souboru testng.xml, kterou nelze přetypovat na odpovídající parametr testovací metody, vyvolá chybu.

Zvažte následující příklad:

Řešení potíží

Zde se atribut 'author' rovná 'Guru99', což je řetězec, zatímco odpovídající testovací metoda očekává celočíselnou hodnotu, takže je vyvolána výjimka.

Problém č. 2: Vaše @Parameters nemají odpovídající hodnotu v souboru testng.xml.

To můžete vyřešit přidáním @Volitelné anotace k odpovídajícímu parametru v zkušební metodě.

Řešení potíží

Problém č. 3: Chcete otestovat více hodnot stejného parametru pomocí souboru testng.xml.

Jednoduchá odpověď je, že to nelze provést. Můžete mít více různých parametrů, ale každý parametr může obsahovat pouze jednu hodnotu. Tím se zabrání pevnému kódování hodnot do skriptu a kód se dá znovu použít – představte si to jako konfigurační soubor pro váš skript. Pokud potřebujete pro jeden parametr více hodnot, použijte místo toho objekt DataProvider.

Poskytovatel dat v TestNG

Poskytovatel dat v TestNG je metoda používaná, když uživatel potřebuje předat složité parametry. Složité parametry je třeba vytvořit z Java — metoda poskytovatele dat může předávat komplexní objekty, objekty ze souborů vlastností nebo objekty z databáze. Metoda je anotována pomocí @DataProvider a vrací pole objektů.

Parametry pomocí Dataprovider

Anotace @Parameters je jednoduchá, ale pro testování s více sadami dat potřebujeme použít poskytovatele dat.

Abychom mohli pomocí našeho testovacího frameworku vyplnit tisíce webových formulářů, potřebujeme jinou metodologii, která dokáže v jediném běhovém toku poskytnout velmi rozsáhlou datovou sadu.

Tohoto konceptu založeného na datech je dosaženo tím, že @DataProvider anotace v TestNG.

Parametry pomocí Dataprovider

Má jen jeden atribut, 'jméno'Pokud nezadáte atribut name, název objektu DataProvider bude stejný jako odpovídající název metody.

Poskytovatel dat vrací dvourozměrný Java objekt k testovací metodě a testovací metoda je volána Mkrát pro pole objektů M×N. Například pokud DataProvider vrací pole objektů 2×3, odpovídající testovací případ je volána 2krát se 3 parametry pokaždé.

Parametry pomocí Dataprovider

Kompletní příklad

Parametry pomocí 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" }
        };
    }
}

Vyvolejte DataProvider z jiné třídy

Ve výchozím nastavení se objekt DataProvider nachází ve stejné třídě jako testovací metoda nebo v její základní třídě. Chcete-li jej umístit do jiné třídy, vytvořte metodu poskytovatele dat. statický a přidejte atribut dataProviderClass k @Test anotace.

Vyvolat DataProvider z jiné třídy

Code Příklad

Vyvolat DataProvider z jiné třídy

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

Typy parametrů v Dataprovider

Metoda DataProvider podporuje dva typy parametrů.

Metoda — pokud stejný DataProvider by se měl chovat odlišně pro různé testovací metody, použijte parametr Method.

Typy parametrů v Dataprovider

V následujícím příkladu:

  • Zkontrolujeme, zda je název metody testMethodA
  • Pokud ano, vraťte jednu sadu hodnot
  • Jinak vraťte jinou sadu hodnot
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" }
            };
        }
    }
}

Zde je výstup:

Typy parametrů v Dataprovider

ITestContext — toto lze použít k vytvoření různých parametrů pro testovací případy na základě skupin.

V reálném životě můžete pomocí ITestContextu měnit hodnoty parametrů na základě testovacích metod, hostitelů nebo konfigurací testů.

Typy parametrů v Dataprovider

V následujícím příkladu kódu:

  • Máme 2 skupiny, A a B
  • Každá testovací metoda je přiřazena skupině
  • Pokud je hodnota skupiny A, vrátí se jedna datová sada.
  • Pokud je hodnota skupiny B, vrátí se další datová sada.
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;
    }
}

Poznámka: Pokud spustíte TestNG třídu přímo, nejprve zavolá poskytovatele dat a poskytovatel nemůže číst informace o skupině, protože skupiny ještě nejsou k dispozici. Volání třídy prostřednictvím testng.xml zpřístupní informace o skupině prostřednictvím ITestContext. Ke spuštění testu použijte následující 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 mechanismy jsou nyní pokryty, takže praktickou otázkou je, po kterém z nich sáhnout.

@Parameters vs. @DataProvider: Který použít

Tyto dva přístupy nejsou zaměnitelné. Rozhodnutí závisí na tom, kolik kombinací hodnot test potřebuje a odkud tyto hodnoty pocházejí.

Kritérium @Parametry + testng.xml @DataProvider
Hodnoty na parametr Přesně jeden Neomezený počet řádků
Zdroj dat Statický text v souboru XML Java kód, Excel, CSV, databáze, API
Podporované typy Typové převody hodnot z řetězce String Žádný Java objekt
Vyvolání testů Jednou za konfiguraci Jednou na řádek dat
Změna dat vyžaduje Úprava souboru XML Úprava zdrojového kódu, často bez rekompilace
Nejlépe se hodí Hodnoty prostředí a konfigurace, jako je prohlížeč, URL, pověření Testování řízené daty napříč mnoha kombinacemi vstupů

V praxi většina sad používá obojí: @Parameters obsahuje nastavení prostředí, která zůstávají po celou dobu běhu konstantní, a @DataProvider dodává proměnná obchodní data. Když datová sada přeroste pevně zakódované pole, dalším krokem je její načtení z tabulky.

Jak číst testovací data ze souboru Excelu pomocí DataProvider

Pevně ​​zakódovaná pole se přestanou škálovat, jakmile testeři, kteří nepíší Java potřeba udržovat data. Přesunutím řádků do tabulky se oddělí testovací data od testovací logiky, což je praktická forma testování řízené datyApache POI přečte sešit a DataProvider převede každý řádek na jedno testovací volání.

  1. Přidejte závislost. Zahrnout org.apache.poi:poi-ooxml ve vašem Mavenu nebo Gradle stavět. Ten ooxml artefakt zpracovává formát .xlsx; prostý poi čte pouze starší soubory .xls.
  2. Vytvořte sešit. Vložte záhlaví řádku do řádku 0 a jeden testovací případ na řádek pod něj, s jedním sloupcem na argument testovací metody.
  3. Přečtěte list do pole. Velikost objektu Object[][] se určí podle počtu řádků a buněk, aby se nové řádky načítaly beze změn kódu.
  4. Vraťte to od poskytovatele. Podpis testovací metody zůstává přesně stejný jako předtím.
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;
    }
}

💡 Tip: volání getStringCellValue() pouze na buňkách formátovaných jako text. Číselná buňka vyvolá IllegalStateException, což je nejčastější chyba, když tabulka obsahuje ID nebo částky. Použijte DataFormatter číst každý typ buňky jako řetězec nebo zapnout cell.getCellType() a explicitně převést.

S externalizovanými daty se přidání stovky dalších testovacích případů stává úpravou tabulky spíše než změnou kódu a stejný poskytovatel může prostřednictvím dataProviderClass atribut zobrazený dříve.

Nejčastější dotazy

Ano. Nastavení @DataProvider(name="x", parallel=true) spustí řádky souběžně. Každé vlákno potřebuje svou vlastní instanci WebDriveru, takže ovladač uložte do ThreadLocal, jinak se testy vzájemně ruší.

Ano. TestNG přijímá Iterator<Object[]>, který dodává řádky líně, místo aby se celé pole sestavovalo v paměti. To je vhodné pro velmi velké datové sady nebo řádky streamované z databázového kurzoru.

Ano. AI Nástroje generují hraniční hodnoty, neplatné vstupy a realistické syntetické záznamy ze specifikace pole. RevPřed přidáním řádků do poskytovatele si prohlédněte výstup, zda neobsahuje duplikáty, a ověřte, zda jsou očekávané výsledky správné.

Asistenti umělé inteligence označují redundantní datové řádky, které používají stejnou kódovou cestu, shlukují selhání podle sdílených vstupních charakteristik a navrhují samoopravu. lokátory když se změní kódování aplikace.

Hodnoty v souboru testng.xml jsou vždy čteny jako text. TestNG převede je na deklarovaný typ argumentu, takže nečíselná hodnota vázaná na celočíselný argument selže. Porovnejte hodnotu XML s signaturou metody nebo přijměte řetězec a analyzujte jej.

Shrňte tento příspěvek takto: