डेटाप्रदाता एवं TestNG XML: पैरामीटरीकरण Selenium(उदाहरण)
पैरामीटरीकरण Selenium
पैरामीटरीकरण Selenium रनटाइम पर एप्लिकेशन को कई डेटा पास करने के लिए टेस्ट स्क्रिप्ट को पैरामीटराइज़ करने की एक प्रक्रिया है। यह निष्पादन की एक रणनीति है जो विभिन्न मानों का उपयोग करके स्वचालित रूप से कई बार परीक्षण मामलों को चलाती है। परीक्षण स्क्रिप्ट को पैरामीटराइज़ करके प्राप्त की गई अवधारणा को कहा जाता है डेटा संचालित परीक्षण.
पैरामीटरीकरण का प्रकार TestNG-
पैरामीटराइजेशन को और अधिक स्पष्ट करने के लिए, हम सबसे लोकप्रिय फ्रेमवर्क में पैरामीटराइजेशन विकल्पों पर विचार करेंगे। Selenium वेबड्राइवर – TestNG.
वहां दो तरीके जिसके द्वारा हम पैरामीटराइजेशन प्राप्त कर सकते हैं TestNG
Testng.xml से पैरामीटर्स सूट या टेस्ट लेवल हो सकते हैं
DataProvider से पैरामीटर, Method और ITestContext को पैरामीटर के रूप में ले सकता है।
आइये इनका विस्तार से अध्ययन करें –
पैरामीटर एनोटेशन TestNG
पैरामीटर एनोटेशन TestNG .xml फ़ाइल का उपयोग करके परीक्षण विधियों में मानों को तर्क के रूप में पास करने के लिए उपयोग की जाने वाली विधि है। रन टाइम के दौरान उपयोगकर्ताओं को परीक्षण विधियों में मान पास करने की आवश्यकता हो सकती है। @Parameters एनोटेशन विधि का उपयोग @Test, @Before, @After या @Factory एनोटेशन वाली किसी भी विधि में किया जा सकता है।
Testng.xml के साथ पैरामीटर एनोटेशन
जब आप जटिलता से निपटना चाहते हैं और इनपुट संयोजनों की संख्या कम है तो एनोटेशन का उपयोग करके पैरामीटराइजेशन का चयन करें।
आइये देखें यह कैसे काम करता है
परिदृश्य का परीक्षण करें
चरण 1) ब्राउज़र लॉन्च करें और Google.com पर जाएं
चरण 2) खोज कीवर्ड दर्ज करें
चरण 3) सत्यापित करें कि इनपुट किया गया मान हमारे परीक्षण डेटा द्वारा प्रदान किए गए मान के समान है
चरण 4) सभी मान इनपुट होने तक 2 और 3 को दोहराएं
परीक्षण लेखक | खोजकुंजी |
---|---|
Guru99 | इंडिया |
Krishna | अमेरिका |
भुपेश | चीन |
यहां एक उदाहरण दिया गया है कि बिना पैरामीटर के इसे कैसे किया जाए
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)); } }
एक अध्ययन, उपरोक्त उदाहरण। जरा कल्पना करें कि जब हम 3 इनपुट संयोजनों के लिए ऐसा करेंगे तो कोड कितना जटिल हो जाएगा
अब, आइए इसका उपयोग करके पैरामीटराइज़ करें TestNG
ऐसा करने के लिए, आपको यह करना होगा
- एक XML फ़ाइल बनाएं जो पैरामीटर्स को संग्रहीत करेगी
-
परीक्षण में, एनोटेशन @Parameters जोड़ें
यहाँ पूरा कोड है
टेस्ट स्तर 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>
पैरामीटरके साथTestNGXML.java फ़ाइल
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)); } }
स्क्रिप्ट चलाने के निर्देश, XML फ़ाइल का चयन करें और टेस्ट NG सुइट के रूप में चलाएँ
.xml फ़ाइल पर राइट क्लिक करें -> Run as -> टेस्टिंग सुइट (नोट : सुइट)
अब, मापदंडों को 2 स्तरों पर परिभाषित किया जा सकता है
- सुइट स्तर - अंदर के पैरामीटर टैग TestNG XML फ़ाइल एक सुइट स्तर पैरामीटर होगा.
- परीक्षण स्तर - परीक्षण के अंदर के पैरामीटर परीक्षण XML फ़ाइल का टैग एक परीक्षण स्तर पैरामीटर होगा।
यहाँ सुइट स्तर के मापदंडों के साथ एक ही परीक्षण है
नोट: यदि पैरामीटर का नाम सूट लेवल और टेस्ट लेवल में समान है, तो टेस्ट लेवल पैरामीटर को सूट लेवल पर वरीयता मिलेगी। तो, उस स्थिति में, उस टेस्ट लेवल के अंदर की सभी क्लास ओवरराइड किए गए पैरामीटर को साझा करेंगी, और टेस्ट लेवल के बाहर की अन्य क्लास सूट लेवल पैरामीटर को साझा करेंगी।
समस्या निवारण
अंक # 1 testng.xml में पैरामीटर मान को संबंधित परीक्षण विधि के पैरामीटर में टाइपकास्ट नहीं किया जा सकता है, इससे त्रुटि उत्पन्न होगी।
निम्नलिखित उदाहरण पर विचार करें
यहां, 'author' विशेषता 'Guru99' के बराबर है जो एक स्ट्रिंग है और संबंधित परीक्षण विधि में यह एक पूर्णांक मान की अपेक्षा कर रहा है, इसलिए हमें यहां एक अपवाद मिलेगा।
अंक # 2 आपके @Parameters का testing.xml में कोई संगत मान नहीं है।
आप इस स्थिति को जोड़कर हल कर सकते हैं @वैकल्पिक टिप्पणी परीक्षण विधि में संगत पैरामीटर में।
अंक # 3: आप Testng.xml का उपयोग करके एक ही पैरामीटर के एकाधिक मानों का परीक्षण करना चाहते हैं
सरल उत्तर यह है कि ऐसा नहीं किया जा सकता! आपके पास कई अलग-अलग पैरामीटर हो सकते हैं, लेकिन प्रत्येक पैरामीटर में केवल एक ही मान हो सकता है। यह स्क्रिप्ट में मानों को हार्डकोड करने से रोकने में मदद करता है। यह कोड को पुनः उपयोग करने योग्य बनाता है। इसे अपनी स्क्रिप्ट के लिए कॉन्फ़िगरेशन फ़ाइल के रूप में सोचें। यदि आप किसी पैरामीटर के लिए कई मानों का उपयोग करना चाहते हैं तो DataProviders का उपयोग करें
डेटा प्रदाता TestNG
डेटा प्रदाता TestNG यह एक विधि है जिसका उपयोग तब किया जाता है जब उपयोगकर्ता को जटिल पैरामीटर पास करने की आवश्यकता होती है। जटिल पैरामीटर को बनाने की आवश्यकता होती है Java जैसे कि जटिल ऑब्जेक्ट, प्रॉपर्टी फ़ाइलों से या डेटाबेस से ऑब्जेक्ट को डेटा प्रदाता विधि द्वारा पास किया जा सकता है। विधि @DataProvider द्वारा एनोटेट की गई है और यह ऑब्जेक्ट की एक सरणी लौटाती है।
डेटाप्रदाता का उपयोग करने वाले पैरामीटर
@पैरामीटर्स एनोटेशन आसान है लेकिन डेटा के एकाधिक सेटों के साथ परीक्षण करने के लिए हमें डेटा प्रदाता का उपयोग करने की आवश्यकता है।
हमारे परीक्षण ढांचे का उपयोग करके हजारों वेब फ़ॉर्म भरने के लिए हमें एक अलग कार्यप्रणाली की आवश्यकता है जो हमें एकल निष्पादन प्रवाह में बहुत बड़ा डेटासेट दे सके।
यह डेटा संचालित अवधारणा निम्न द्वारा प्राप्त की जाती है @डेटाप्रदाता एनोटेशन में TestNG.
इसमें केवल एक ही विशेषता 'नाम'यदि आप नाम विशेषता निर्दिष्ट नहीं करते हैं तो डेटा प्रदाता का नाम संबंधित विधि नाम के समान होगा।
डेटा प्रदाता रिटर्न एक द्वि-आयामी JAVA ऑब्जेक्ट टेस्ट विधि और टेस्ट विधि, M*N प्रकार की ऑब्जेक्ट सरणी में M बार इनवोक करेगी। उदाहरण के लिए, यदि डेटाप्रोवाइडर 2*3 ऑब्जेक्ट की सरणी लौटाता है, तो संबंधित टेस्टकेस को हर बार 2 पैरामीटर के साथ 3 बार इनवोक किया जाएगा।
पूरा उदाहरण
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" } }; } }
भिन्न वर्ग से DataProvider को आमंत्रित करें
डिफ़ॉल्ट रूप से, DataProvider उसी क्लास में रहता है जहाँ टेस्ट मेथड है या उसका बेस क्लास है। इसे किसी अन्य क्लास में रखने के लिए हमें डेटा प्रोवाइडर मेथड को स्टैटिक बनाना होगा और टेस्ट मेथड में हमें एक विशेषता जोड़नी होगी डेटा प्रदाताक्लास in @परीक्षा एनोटेशन।
कोड उदाहरण
TestClass पैरामीटरDataproviderWithClassLevel.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)); } }
डेटाप्रदाताक्लास.जावा
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" } }; }}
डेटाप्रदाता में पैरामीटर के प्रकार
डेटाप्रदाता विधि द्वारा दो प्रकार के पैरामीटर समर्थित हैं।
विधि- अगर वही डेटाप्रदाता को विभिन्न परीक्षण विधि के साथ अलग-अलग व्यवहार करना चाहिए, विधि पैरामीटर का उपयोग करें।
निम्नलिखित उदाहरण में,
- हम जाँचते हैं कि क्या विधि का नाम testMethodA है।
- यदि हाँ तो मान का एक सेट लौटाएँ
- अन्यथा मान का दूसरा सेट लौटाएँ
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" } };} } }
आउटपुट यह है
ITestContext- इसका उपयोग समूहों के आधार पर परीक्षण मामलों के लिए अलग-अलग पैरामीटर बनाने के लिए किया जा सकता है।
वास्तविक जीवन में, आप परीक्षण विधियों, होस्ट, परीक्षण के कॉन्फ़िगरेशन के आधार पर पैरामीटर मानों को बदलने के लिए ITestContext का उपयोग कर सकते हैं।
निम्नलिखित कोड उदाहरण में
- हमारे पास 2 समूह A और B हैं
- प्रत्येक परीक्षण विधि को एक समूह को सौंपा गया है
- यदि समूह का मान A है, तो एक विशेष डेटा सेट लौटाया जाता है
- यदि समूह का मान B है, तो दूसरा डेटा सेट लौटाया जाता है
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; } }
नोट: यदि आप सीधे अपना testng क्लास चलाते हैं, तो यह पहले dataprovider को कॉल करेगा जो समूह जानकारी प्राप्त नहीं कर सकता क्योंकि समूह उपलब्ध नहीं हैं। लेकिन इसके बजाय यदि आप इस क्लास को testng.xml के माध्यम से कॉल करते हैं, तो इसमें ITestContext के साथ समूह जानकारी उपलब्ध होगी। टेस्ट को कॉल करने के लिए निम्न XML का उपयोग करें
<!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>
सारांश
- पैरामीटरीकरण बनाने की आवश्यकता है डेटा संचालित परीक्षण.
- TestNG दो प्रकार के पैरामीटराइजेशन का समर्थन करें, @पैरामीटर+TestNG. Xml और उपयोग कर रहे हैं@डेटाप्रदाता
-
In @पैरामीटर+TestNG. Xml पैरामीटर्स को सुइट स्तर और परीक्षण स्तर में रखा जा सकता है।
दोनों स्थानों पर एक ही पैरामीटर नाम घोषित किया गया है; परीक्षण स्तर पैरामीटर को सूट स्तर पैरामीटर पर वरीयता दी जाएगी।
- @पैरामीटर+ का उपयोग करकेTestNG.xml में एक समय में केवल एक मान सेट किया जा सकता है, लेकिन @DataProvider रिटर्न करता है ऑब्जेक्ट की 2d सरणी.
- यदि DataProvider उस वर्ग से भिन्न वर्ग में मौजूद है जहाँ परीक्षण विधि स्थित है,डेटा प्रदाता होना चाहिए स्थैतिक विधि.
- इसके द्वारा दो पैरामीटर समर्थित हैं डेटा प्रदाता रहे विधि और ITestContext.