Tietojentarjoaja TestNG: Selenium Parametrisointiesimerkki

โšก ร„lykรคs yhteenveto

Parametrisointi sisรครคn Selenium suorittaa yhden testimenetelmรคn toistuvasti eri tietojoukkoja vasten, muuttaen yhden skriptin datalรคhtรถiseksi kattavuudeksi. TestNG tarjoaa tรคhรคn kaksi mekanismia: testng.xml-tiedostoon perustuvan @Parameters-annotaation ja kaksiulotteisen objektitaulukon palauttavan @DataProvider-annotaation.

  • ๐ŸŽฏ Ydintarkoitus: Parametrisointi poistaa testiskripteistรค kovakoodatut arvot, joten sama logiikka validoi kaikki sovelluksen tukemat syรถteyhdistelmรคt.
  • ๐Ÿ“„ XML-mekanismi: @Parameters-annotaatio lukee testng.xml-tiedostossa ilmoitetut nimi-arvo-parit, mikรค sopii konfigurointityyppisiin syรถtteisiin, joissa yhdistelmien mรครคrรค pysyy pienenรค.
  • ๐Ÿท๏ธ Soveltamisalan etusija: Testitasolla ilmoitetut parametrit ohittavat identtisesti nimetyt parametrit pakettitasolla, kun taas testin ulkopuoliset luokat jatkavat pakettitason arvon lukemista.
  • ๐Ÿ—‚๏ธ Tiedontarjoajan mekanismi: @DataProvider-merkinnรคllรค varustettu metodi palauttaa Object[][]:n, ja TestNG kutsuu testiรค kerran riviรค kohden ja vรคlittรครค jokaisen sarakkeen argumenttina.
  • ๐Ÿ”— Ulkoiset palveluntarjoajat: Palveluntarjoajan merkitseminen static-arvoksi ja dataProviderClass-arvon asettaminen @Test-kohdassa antaa useille testiluokille mahdollisuuden jakaa yhden tietolรคhteen.
  • ๐Ÿงญ Dynaamiset tietojoukot: Methodin tai ITestContext-funktion hyvรคksyminen toimittaja-argumenttina palauttaa eri tiedot testimetodin tai sisรคllytetyn ryhmรคn mukaan.
  • ๐Ÿ›ก๏ธ Yleisiรค vikoja: XML-arvojen ja metodiargumenttien vรคliset tyyppiristiriidat sekรค @Optional-metodilla ratkaistut puuttuvat parametrit aiheuttavat useimmat annotointivirheet.

Tietojentarjoaja TestNG

Kun luomme ohjelmistoja, haluamme aina, ettรค ne toimivat oikein erilaisten datajoukkojen kanssa. Kun on kyse testaus Kyseisessรค ohjelmistossa yhden tietojoukon tarkistaminen ei riitรค. Meidรคn on varmistettava, ettรค jรคrjestelmรค hyvรคksyy kaikki yhdistelmรคt, joita sen odotetaan tukevan. Tรคtรค varten meidรคn on parametroitava testiskriptimme. Tรคssรค kohtaa parametrointi astuu kuvaan.

Parametrisointi sisรครคn Selenium

Parametrisointi sisรครคn Selenium on prosessi testiskriptien parametroimiseksi useiden tietojen vรคlittรคmiseksi sovellukselle suorituksen aikana. Se on suoritusstrategia, joka suorittaa testitapaukset automaattisesti useita kertoja eri arvoilla. Konseptia, joka saavutetaan parametroimalla testiskriptit, kutsutaan Tietoihin perustuva testaus.

Parametrisoinnin tyyppi sisรครคn TestNG

Parametrisoinnin selkeyttรคmiseksi kรคymme lรคpi parametrisointivaihtoehdot yhdessรค suosituimmista viitekehyksistรค, jotka on tarkoitettu Selenium WebDriver โ€” TestNG.

On kaksi tapaa jolla voimme saavuttaa parametroinnin TestNG:

  1. Kanssa Parametrien merkinnรคt ja TestNG XML tiedosto.

Parametrisoinnin tyyppi sisรครคn TestNG

  1. Kanssa DataProvider merkintรค.

Parametrisoinnin tyyppi sisรครคn TestNG

Parametrisoinnin tyyppi sisรครคn TestNG

Yllรค oleva kaavio tiivistรครค jaon: testng.xml-tiedoston parametrit voidaan mรครคrittรครค paketti- tai testitasolla, kun taas DataProviderin parametri voi hyvรคksyรค Method ja ITestContext omana argumenttinaan. Tutkitaanpa niitรค yksityiskohtaisesti.

Parametrit Annotaatio sisรครคn TestNG

Parametrit Annotaatio sisรครคn TestNG on menetelmรค, jota kรคytetรครคn arvojen vรคlittรคmiseen testimetodeille argumentteina .xml-tiedoston avulla. Kรคyttรคjien on ehkรค vรคlitettรคvรค arvot testimetodeille suorituksen aikana. @Parameters-annotaatiometodia voidaan kรคyttรครค missรค tahansa metodissa, jossa on @Test-, @Before-, @After- tai @Factory-annotaatio.

Parametrien huomautus Testng.xml:llรค

Valitse parametrointi annotaatioiden avulla, kun et halua kรคsitellรค monimutkaisuutta ja syรถteyhdistelmien mรครคrรค on pieni.

Katsotaanpa, miten tรคmรค toimii.

Testiskenaario

Vaihe 1) Kรคynnistรค selain ja siirry osoitteeseen Google.com

Vaihe 2) Kirjoita hakusana

Parametrien huomautus Testng.Xml:llรค

Vaihe 3) Varmista, ettรค syรถtetty arvo on sama kuin testidatan antama arvo

Vaihe 4) Toista vaiheet 2 ja 3, kunnes kaikki arvot on syรถtetty

Testin kirjoittaja Hakuavain
Guru99 Intia
Krishna Soumi
Bhupesh Kiina

Tรคssรค on esimerkki siitรค, miten se tehdรครคn ilman parametrit:

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 Vuoden 4 huomautus: Kolme riviรค tรคmรคn esimerkin alkuperรคisessรค versiossa ei enรครค kรครคnny tai ne ovat vanhentuneita nykyisessรค versiossa Selenium tiedotteet. System.setProperty("webdriver.gecko.driver", โ€ฆ) on tarpeetonta Selenium 4.6 eteenpรคin, koska Selenium Manager selvittรครค ajuribinรครคritiedoston automaattisesti. implicitlyWait(10, TimeUnit.SECONDS) ylikuormitus poistettiin vuonna Selenium 4 ja korvattu implicitlyWait(Duration.ofSeconds(10)). getAttribute() oli vanhentunut vuonna Selenium 4.27, joten tekstilaatikon lukeminen kรคyttรครค getDomProperty("value")Jokainen alla oleva esimerkki soveltaa samoja kolmea korjausta.

Tutki yllรค olevaa esimerkkiรค ja kuvittele, kuinka monimutkaiseksi koodista tulee, kun tรคmรค toistetaan kolmella syรถteyhdistelmรคllรค.

Parametrisoidaan se nyt kรคyttรคmรคllรค TestNGVoit tehdรค niin seuraavasti:

  • Luo XML-tiedosto, joka tallentaa parametrit
  • Lisรครค testiin annotaatio @Parameters

Parametrien huomautus Testng.Xml:llรค

Tรคssรค on tรคydellinen koodi.

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

Parametri WithTestNGXML.java tiedosto

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

Suorittaaksesi komentosarjan, valitse XML-tiedosto ja suorita se TestNG sviitti.

Napsauta .xml-tiedostoa hiiren kakkospainikkeella -> Suorita nimellรค -> TestNG Sviitti (Huomautus: Sviitti)

Parametri WithTestNGXML.java tiedosto

Parametrit voidaan mรครคritellรค kahdella tasolla:

  1. Suite-taso โ€” parametrit sisรคllรค <suite> tagi TestNG XML-tiedostot ovat ohjelmistopaketin tason parametreja.
  2. Testitaso โ€” parametrit sisรคllรค <test> tagi TestNG XML-tiedostot ovat testitason parametreja.

Tรคssรค on sama testi sviittitason parametreilla:

Parametri WithTestNGXML.java tiedosto

HUOMAUTUS: Jos parametrin nimi on sama sekรค paketin tasolla ettรค testitasolla, testitason parametrilla on etusija paketin ykkรถstason parametriin nรคhden. Tรคssรค tapauksessa kaikki kyseisen testitason sisรคllรค olevat luokat jakavat ohitetun parametrin, ja kyseisen testitason ulkopuoliset luokat kรคyttรคvรคt edelleen paketin tasoparametria.

Parametri WithTestNGXML.java tiedosto

Ongelmien karttoittaminen

Ongelma 1: Testing.xml-tiedoston parametriarvo, jota ei voida tyypittรครค vastaavan testimetodin parametriksi, aiheuttaa virheen.

Harkitse seuraavaa esimerkkiรค:

Ongelmien karttoittaminen

Tรคssรค 'tekijรค'-attribuutti on yhtรค kuin 'Guru99', joka on merkkijono, kun taas vastaava testimetodi odottaa kokonaislukuarvoa, joten syntyy poikkeus.

Ongelma 2: @Parameters-parametreillasi ei ole vastaavaa arvoa testng.xml-tiedostossa.

Voit ratkaista tรคmรคn lisรครคmรคllรค @Valinnainen merkintรค testimenetelmรคn vastaavaan parametriin.

Ongelmien karttoittaminen

Ongelma 3: Haluat testata useita saman parametrin arvoja kรคyttรคmรคllรค testng.xml-tiedostoa.

Yksinkertainen vastaus on, ettรค tรคtรค ei voida tehdรค. Sinulla voi olla useita eri parametreja, mutta jokainen parametri voi sisรคltรครค vain yhden arvon. Tรคmรค estรครค arvojen kovakoodaamisen skriptiin ja pitรครค koodin uudelleenkรคytettรคvรคnรค โ€“ ajattele sitรค skriptisi asetustiedostona. Jos tarvitset useita arvoja yhdelle parametrille, kรคytรค sen sijaan DataProvideria.

Tietojen toimittaja sisรครคn TestNG

Tietojen toimittaja sisรครคn TestNG on menetelmรค, jota kรคytetรครคn, kun kรคyttรคjรคn on annettava monimutkaisia โ€‹โ€‹parametreja. Monimutkaiset parametrit on luotava Java โ€” Tiedon tarjoaja -metodi voi vรคlittรครค monimutkaisia โ€‹โ€‹objekteja, ominaisuustiedostojen objekteja tai tietokannan objekteja. Metodi annotoidaan @DataProvider-tunnisteella ja se palauttaa objektitaulukon.

Parametrit Dataproviderilla

@Parameters-annotaatio on helppo, mutta useiden tietojoukkojen testaamiseen meidรคn on kรคytettรคvรค tiedontarjoajaa.

Tรคyttรครคksemme tuhansia verkkolomakkeita testauskehyksemme avulla tarvitsemme erilaisen menetelmรคn, joka pystyy tuottamaan erittรคin suuren tietojoukon yhdessรค suoritusvirrassa.

Tรคmรค datalรคhtรถinen konsepti saavutetaan siten, ettรค @DataProvider huomautus sisรครคn TestNG.

Dataprovider-parametrit

Siinรค on vain yksi attribuutti, 'nimi'Jos et mรครคritรค name-attribuuttia, DataProviderin nimi on sama kuin vastaavan metodin nimi.

Tiedontoimittaja palauttaa kaksiulotteinen Java objekti testimetodiin, ja testimetodia kutsutaan M kertaa Mร—N-objektitaulukolle. Esimerkiksi, jos DataProvider palauttaa taulukon, jossa on 2ร—3 objektia, vastaava testitapaus kutsutaan kaksi kertaa kolmella parametrilla joka kerta.

Dataprovider-parametrit

Tรคydellinen esimerkki

Dataprovider-parametrit

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

Kutsu DataProvider eri luokasta

Oletusarvoisesti DataProvider sijaitsee samassa luokassa kuin testimetodi tai sen perusluokassa. Jos haluat sijoittaa sen toiseen luokkaan, tee dataprovider-metodista staattinen ja lisรครค attribuutti dataProviderClass ettรค @Testata merkintรค.

Kutsu DataProvider eri luokasta

Code esimerkki

Kutsu DataProvider eri luokasta

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

Dataproviderin parametrityypit

DataProvider-metodi tukee kahdenlaisia โ€‹โ€‹parametreja.

Menetelmรค โ€” jos sama DataProviderin tulisi toimia eri tavoin eri testimetodeilla, kรคytรค Method-parametria.

Dataproviderin parametrityypit

Seuraavassa esimerkissรค:

  • Tarkistamme, onko metodin nimi testMethodA
  • Jos kyllรค, palauta yksi arvojoukko
  • Muussa tapauksessa palauta toinen arvojoukko
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" }
            };
        }
    }
}

Tรคssรค on tuotos:

Dataproviderin parametrityypit

ITestContext โ€” tรคtรค voidaan kรคyttรครค luomaan erilaisia โ€‹โ€‹parametreja testitapauksille ryhmien perusteella.

Todellisessa elรคmรคssรค voit kรคyttรครค ITestContextia parametrien arvojen muuttamiseen testimenetelmien, isรคntien tai testimรครคritysten perusteella.

Dataproviderin parametrityypit

Seuraavassa koodiesimerkissรค:

  • Meillรค on kaksi ryhmรครค, A ja B
  • Jokainen testimenetelmรค on mรครคritetty ryhmรครคn
  • Jos ryhmรคn arvo on A, palautetaan yksi tietojoukko
  • Jos ryhmรคn arvo on B, palautetaan toinen tietojoukko.
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;
    }
}

Huomautus: Jos suoritat TestNG suoraan luokkaan, se kutsuu ensin tiedon tarjoajaa, eikรค tarjoaja voi lukea ryhmรคtietoja, koska ryhmรคt eivรคt ole vielรค saatavilla. Luokan kutsuminen testng.xml-tiedoston kautta tekee ryhmรคtiedot saataville ITestContext-tiedoston kautta. Kรคytรค seuraavaa XML-tiedostoa testin suorittamiseen:

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

Molemmat mekanismit on nyt kรคsitelty, joten kรคytรคnnรถn kysymys on, kumpaan kannattaa tarttua.

@Parameters vs. @DataProvider: Kumpaa kรคyttรครค

Nรคmรค kaksi lรคhestymistapaa eivรคt ole keskenรครคn vaihdettavissa. Pรครคtรถs riippuu siitรค, kuinka monta arvoyhdistelmรครค testi tarvitsee ja mistรค nรคmรค arvot ovat perรคisin.

Kriteeri @Parametrit + testng.xml @DataProvider
Arvot parametria kohden Tasan yksi Rajoittamaton mรครคrรค rivejรค
Tietolรคhde Staattinen teksti XML-tiedostossa Java koodi, Excel, CSV, tietokanta, API
Tuetut tyypit Merkkijonosta tyypitettyjen arvojen mitรครคn Java objekti
Testien kutsut Kerran konfiguraatiota kohden Kerran datariviรค kohden
Tietojen muuttaminen vaatii XML-tiedoston muokkaaminen Lรคhdekoodin muokkaaminen, usein ei uudelleenkรครคntรคmistรค
Soveltuu parhaiten Ympรคristรถ- ja mรครคritysarvot, kuten selain, URL, valtakirjat Datalรคhtรถinen testaus useilla syรถteyhdistelmillรค

Kรคytรคnnรถssรค useimmat paketit kรคyttรคvรคt molempia: @Parameters sisรคltรครค ympรคristรถasetukset, jotka pysyvรคt vakioina koko ajon ajan, ja @DataProvider toimittaa vaihtelevat liiketoimintatiedot. Kun tietojoukko kasvaa ulos kovakoodatusta taulukosta, seuraava vaihe on sen lukeminen laskentataulukosta.

Testidatan lukeminen Excel-tiedostosta DataProviderin avulla

Kovakoodatut taulukot lakkaavat skaalautumasta, kun testaajat, jotka eivรคt kirjoita, Java tarve yllรคpitรครค tietoja. Rivien siirtรคminen taulukkoon erottaa testidatan testilogiikasta, mikรค on kรคytรคnnรถllinen muoto datalรคhtรถinen testausApachen POI lukee tyรถkirjan ja DataProvider muuntaa jokaisen rivin yhdeksi testikutsukseksi.

  1. Lisรครค riippuvuus. Sisรคltรครค org.apache.poi:poi-ooxml Mavenissasi tai Gradle rakentaa. ooxml artefakti kรคsittelee .xlsx-muotoa; tavallinen poi lukee vain vanhoja .xls-tiedostoja.
  2. Luo tyรถkirja. Sijoita otsikkorivi riville 0 ja yksi testitapaus riviรค kohden sen alle, yksi sarake testimetodiargumenttia kohden.
  3. Lue taulukko taulukkoon. Muuta Object[][] -luokan kokoa rivi- ja solumรครคrien perusteella, jotta uudet rivit poimitaan ilman koodimuutoksia.
  4. Palauta se toimittajalta. Testimenetelmรคn allekirjoitus pysyy tรคsmรคlleen ennallaan.
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;
    }
}

๐Ÿ’ก Vinkki: Puhelu getStringCellValue() vain tekstiksi muotoilluissa soluissa. Numeerinen solu heittรครค IllegalStateException, mikรค on yleisin virhe, kun laskentataulukko sisรคltรครค tunnisteita tai summia. Kรคytรค DataFormatter lukeaksesi jokaisen solutyypin merkkijonona tai kytkeรคksesi pรครคlle cell.getCellType() ja muuntaa eksplisiittisesti.

Kun data on ulkoistettu, sadan uuden testitapauksen lisรครคmisestรค tuleekin taulukkolaskentaohjelman muokkaus koodinmuutoksen sijaan, ja sama tarjoaja voi syรถttรครค useita testiluokkia palvelimen kautta. dataProviderClass aiemmin nรคytetty ominaisuus.

UKK

Kyllรค. Asetus @DataProvider(name="x", parallel=true) suorittaa rivejรค samanaikaisesti. Jokainen sรคie tarvitsee oman WebDriver-instanssinsa, joten tallenna ajuri ThreadLocal-kohteeseen, muuten testit hรคiritsevรคt toisiaan.

Kyllรค. TestNG hyvรคksyy Iterator<Object[]>, joka syรถttรครค rivejรค laiskasti sen sijaan, ettรค koko taulukko rakennettaisiin muistiin. Tรคmรค sopii erittรคin suurille tietojoukoille tai tietokannan kursorista suoratoistetuille riveille.

Kyllรค. AI tyรถkalut luovat kenttรคmรครคrityksestรค raja-arvoja, virheellisiรค syรถtteitรค ja realistisia synteettisiรค tietueita. RevTarkista tulosteesta kaksoiskappaleet ja varmista, ettรค odotetut tulokset ovat oikein ennen rivien lisรครคmistรค toimittajalle.

Tekoรคlyavustajat merkitsevรคt samaa koodipolkua kรคyttรคvรคt tarpeettomat datarivit, klusteroivat virheet jaettujen syรถteominaisuuksien perusteella ja ehdottavat itsekorjausta paikannuslaitteet kun sovelluksen merkintรคtapa muuttuu.

testng.xml-tiedoston arvot luetaan aina tekstinรค. TestNG muuntaa ne ilmoitetun argumenttityypin mukaisiksi, joten kokonaislukuargumenttiin sidottu ei-numeerinen arvo epรคonnistuu. Yhdistรค XML-arvo metodin allekirjoitukseen tai hyvรคksy merkkijono ja jรคsennรค se.

Tiivistรค tรคmรค viesti seuraavasti: