Andmepakkuja & TestNG XML: parameetrite määramine sisse Selenium(Näide)
Parameetristamine sisse Selenium
Parameetristamine sisse Selenium on testskriptide parameetrite muutmise protsess, et edastada rakendusele käitusajal mitut teavet. See on täitmisstrateegia, mis käivitab testjuhtumeid automaatselt mitu korda, kasutades erinevaid väärtusi. Testskriptide parameetritega saavutatud kontseptsiooni nimetatakse Andmepõhine testimine.
Parameetri tüüp sisse TestNG-
Parameetrite selgemaks muutmiseks vaatame läbi parameetrite määramise valikud ühes kõige populaarsemas raamistikus Selenium Veebidraiver – TestNG.
Seal on kahel viisil mille abil saame saavutada parameetrite muutmise TestNG
Testng.xml parameetrid võivad olla komplekti- või testitasemel
DataProvideri parameeter võib võtta parameetrina Method ja ITestContext.
Uurime neid üksikasjalikult -
Parameetrid Annotatsioon sisse TestNG
Parameetrid Annotatsioon sisse TestNG on meetod, mida kasutatakse väärtuste edastamiseks testmeetoditele argumentidena, kasutades .xml-faili. Kasutajatelt võidakse nõuda väärtuste edastamist katsemeetoditele käitamise ajal. Annotatsioonimeetodit @Parameters saab kasutada mis tahes meetodi puhul, millel on @Test, @Enne, @Pärast või @Tehasannotatsioon.
Parameetrite annotatsioon rakendusega Testng.xml
Valige parameetrid annotatsioonide abil, kui soovite tegeleda keerukusega ja sisendkombinatsioonide arv on väiksem.
Vaatame, kuidas see toimib
Testi stsenaarium
1. samm) Käivitage brauser ja minge saidile Google.com
2. samm) Sisestage otsingu märksõna
3. samm) Veenduge, et sisestatud väärtus on sama, mis meie testiandmetes
Samm 4) Korrake punkte 2 ja 3, kuni kõik väärtused on sisestatud
Testi autor | Otsinguklahv |
---|---|
Guru99 | India |
Krishna | USA |
Bhupesh | Hiina |
Siin on näide, kuidas seda teha ILMA parameetriteta
package parameters; import org.testng.annotations.Test; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class NoParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test public void testNoParameter() throws InterruptedException{ String author = "guru99"; String searchKey = "india"; System.setProperty("webdriver.gecko.driver", driverPath); driver= new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Uuring, ülaltoodud näide. Kujutage vaid ette, kui keeruliseks muutub kood, kui teeme seda kolme sisendikombinatsiooni jaoks
Nüüd parameetriseerime seda kasutades TestNG
Selleks peate seda tegema
- Looge XML-fail, mis salvestab parameetrid
-
Testis lisage annotatsioon @Parameters
Siin on täielik kood
Testi tase TestNG. Xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://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>
Parameeter KoosTestNGXML.java fail
package parameters; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; 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 { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test @Parameters({"author","searchKey"}) public void testParameterWithXML( @Optional("Abc") String author,String searchKey) throws InterruptedException{ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Juhised skripti käitamiseks, valige XML-fail ja Run as Test NG Suite
Paremklõpsake .xml-failil -> Run as -> Testng Sviit (Märkus: Sviit)
Nüüd saab parameetreid määratleda kahel tasemel
- Komplekti tase – parameetrid sees silt TestNG XML-fail on komplektitaseme parameeter.
- Test Level – parameetrid sees testitava XML-faili silt on testitaseme parameeter.
Siin on sama test komplektitaseme parameetritega
MÄRKUS: Kui parameetri nimi on komplektitasemel ja testitasemel sama, eelistatakse testtaseme parameeter komplekti tasemel. Sel juhul jagavad kõik sellel testitasemel olevad klassid tühistatud parameetrit ja teised klassid, mis on väljaspool testitaset, jagavad komplekti taseme parameetrit.
Probleemid
Väljaanne # 1 Parameetri väärtust failis testng.xml ei saa sisestada vastava testmeetodi parameetrile, see annab vea.
Mõelge järgmisele näitele
Siin on atribuut 'autor' võrdne 'Guru99'ga, mis on string ja vastavas testimismeetodis eeldab ta täisarvu, seega saame siin erandi.
Väljaanne # 2 Teie @Parameters pole failis testing.xml vastavat väärtust.
Saate selle olukorra lahendada lisades @valikuline märkus katsemeetodi vastavas parameetris.
3. probleem: Soovite testida sama parameetri mitut väärtust rakendusega Testng.xml
Lihtne vastus on see, et seda ei saa teha! Teil võib olla mitu erinevat parameetrit, kuid igal parameetril võib olla ainult üks väärtus. See aitab vältida väärtuste kõvakodeerimist skripti. See muudab koodi korduvkasutatavaks. Mõelge sellele kui oma skripti konfiguratsioonifailidele. Kui soovite parameetri jaoks kasutada mitut väärtust, kasutage DataProviderit
Andmepakkuja sisse TestNG
Andmepakkuja sisse TestNG on meetod, mida kasutatakse siis, kui kasutajal on vaja edastada keerulisi parameetreid. Keerulised parameetrid tuleb luua Java Näiteks keerukaid objekte, atribuudifailidest või andmebaasist pärit objekte saab edastada andmepakkuja meetodil. Meetodit märgib @DataProvider ja see tagastab objektide massiivi.
Parameetrid Dataprovideri abil
@Parameters annotatsioon on lihtne, kuid mitme andmekomplektiga testimiseks peame kasutama Data Providerit.
Tuhandete veebivormide täitmiseks meie testimisraamistiku abil vajame teistsugust metoodikat, mis võib anda meile ühe täitmisvooga väga suure andmestiku.
See andmepõhine kontseptsioon saavutatakse @DataProvider annotatsioon sisse TestNG.
Sellel on ainult üks atribuut 'nimi'. Kui te nimeatribuuti ei määra, on DataProvideri nimi sama, mis vastava meetodi nimi.
Andmepakkuja tagastab kahemõõtmeline JAVA objekt testimismeetodi ja katsemeetodi vahel, kutsub M korda M*N tüüpi objektimassiivis. Näiteks kui DataProvider tagastab 2*3 objektide massiivi, kutsutakse vastav testjuhtum 2 korda 3 parameetriga iga kord.
Täielik näide
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ //Create firefox driver object System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } /** Test case to verify google search box * @param author * @param searchKey * @throws InterruptedException */ @Test(dataProvider="SearchProvider") public void testMethod(String author,String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //search value in google searchbox searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if the value in google search box is correct Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * @return Object[][] where first column contains 'author' * and second column contains 'searchKey' */ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; } }
Kutsuge DataProvider erinevast klassist
Vaikimisi asub DataProvider samas klassis, kus on testimismeetod või selle põhiklass. Selle paigutamiseks mõnda teise klassi peame muutma andmepakkuja meetodi staatiliseks ja testmeetodis peame lisama atribuudi dataProviderClass in @Test märkus.
Koodinäide
TestClass ParameterDataproviderWithClassLevel.java
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 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 google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); //get text from search box String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify if search box has 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" } }; }}
Andmepakkuja parameetrite tüübid
DataProvideri meetod toetab kahte tüüpi parameetreid.
Meetod- Kui SAMA DataProvider peaks erinevate katsemeetoditega käituma erinevalt, kasutage parameetrit Method.
Järgmises näites
- Kontrollime, kas meetodi nimi on testMethodA.
- Kui jah, tagastage üks väärtuse komplekt
- Vastasel juhul tagastab teise väärtuse komplekti
package parameters; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider") public void testMethodA(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print author and search string System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } @Test(dataProvider="SearchProvider") public void testMethodB(String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print only search string System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here DataProvider returning value on the basis of test method name * @param m * @return **/ @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" } };} } }
Siin on väljund
ITestContext- Seda saab kasutada erinevate parameetrite loomiseks testjuhtumite jaoks rühmade põhjal.
Reaalses elus saate kasutada ITestContexti parameetrite väärtuste muutmiseks vastavalt testimismeetoditele, hostidele ja testi konfiguratsioonidele.
Järgmises koodinäites
- Meil on 2 rühma A ja B
- Iga katsemeetod määratakse rühmale
- Kui rühma väärtus on A, tagastatakse konkreetne andmekogum
- Kui rühma väärtus on B, tagastatakse teine andmekogum
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest(groups={"A","B"}) public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",groups="A") public void testMethodA(String author,String searchKey) throws InterruptedException{ { //search google textbox WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } @Test(dataProvider="SearchProvider",groups="B") public void testMethodB(String searchKey) throws InterruptedException{ { //find google search box WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here the DAtaProvider will provide Object array on the basis on ITestContext * @param c * @return */ @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; } }
Märkus. Kui käivitate testimisklassi otse, helistab see esmalt andmepakkujale, kes ei saa rühmade teavet hankida, kuna rühmad pole saadaval. Kui aga helistate sellele klassile testng.xml kaudu, on sellel ITestContextiga saadaval rühmade teave. Kasutage testi kutsumiseks järgmist XML-i
<!DOCTYPE suite SYSTEM "http://beust.com/testng/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>
kokkuvõte
- Parameetristamine on vaja luua Andmepõhine testimine.
- TestNG toetab kahte tüüpi parameetrite määramist, kasutades @Parameeter+TestNG. Xml ja kasutades@DataProvider
-
In @Parameeter+TestNG. Xml parameetreid saab paigutada komplekti tasemele ja testi tasemele. Kui
Mõlemas kohas on deklareeritud sama parameetri nimi; testitaseme parameeter eelistab ülikonnataseme parameetrit.
- kasutades @Parameter+TestNG.xml saab korraga määrata ainult ühe väärtuse, kuid @DataProvider tagastab 2d objekti massiiv.
- Kui DataProvider on teises klassis, siis klass, kus testmeetod asub,DataProvider peaks olema staatiline meetod.
- Toetatud on kaks parameetrit DataProvider See on Meetod ja ITestContext.