TestNG中的参数化– DataProvider和TestNG XML(带有示例)
測試自動化,或所謂的自動化測試,并不像聽起來那樣容易。 必須考慮所有可能的用戶交互的所有排列和組合,并且在此基礎上,您將必須創建測試腳本以通過多種瀏覽器和OS組合來驗證Web應用程序。 這就是參數化在Selenium自動化測試中起關鍵作用的地方。 在本TestNG教程中,我將向您展示如何在TestNG中執行參數化以進行Selenium自動化測試。
為什么我們要參數化?
在用于Web UI測試的現實世界中,我們希望我們的網站或Web應用程序可以在各種輸入下正常工作,并且實際上不可能僅憑一個數據集來驗證我們的方案。 因此,當暴露給瀏覽器和OS的不同數據集或不同組合時,我們確保應用程序能夠按預期運行。 多個測試組合意味著多個輸入值。
現在,您不能每次都在測試自動化腳本中對測試值進行硬編碼,否則,進行一項更改將需要您編輯許多測試自動化腳本。 這就是TestNG或其他任何參數中出現參數的地方,而我們參數化Selenium自動化測試腳本的原因是在運行時為Web應用程序提供了不同的數據集。
為什么要使用TestNG?
如果您的應用程序涉及輸入不同類型的用戶交互,則必須進行參數化。 我們可以根據所使用的框架對自動化腳本進行參數化,例如用于硒自動化測試的TestNG框架中的參數化。 我們可以考慮使用excel文件來獲取數據集,然后在自動化腳本中使用它,但是隨著我們增強自動化套件,有必要使用更強大的測試自動化框架(如TestNG)來以更強大的方式涵蓋廣泛的測試。 在本文中,我們將主要關注TestNG中的參數化,在TestNG中可以實現的方法以及如何在Selenium自動化測試腳本中編寫這些參數。 首先讓我們開始理解TestNG中不同類型的參數化,以及如何實現相同的功能。
TestNG中的參數化類型
因此,首先我們可以通過兩種方式在TestNG中實現參數化。
使用@Parameters注釋和XML文件在TestNG中進行參數化
首先讓我們看看在類中編寫參數注釋的簡單語法:
@Parameter({“parameter name”})
請注意,我們也可以在注釋中使用多個參數,這些參數可以編寫如下: @Parameters({“param1”,”param2”,”param3”})
到目前為止,參數已被限定為testng.xml文件中的Suite或Test標簽。 如果在Suite和Test中都傳遞了相同的參數值,則優先級將賦予Test標記中傳遞的參數值。
在繼續進行參數化示例之前,我們需要了解在TestNG中使用參數化對Selenium自動化測試活動有什么好處。 考慮一種在Google之類的搜索引擎中搜索某些關鍵字的方案。 我們將必須為每個關鍵字編寫相同的代碼行才能獲得不同的結果,但這不是可行的方法。 這就是TestNG或Selenium的任何其他測試自動化框架中的參數化出現的地方。 使用TestNG中的參數化,可以將這些關鍵字作為不同的參數傳遞到testng.xml中,并在Selenium自動化測試套件中添加@parameters批注。 讓我們以示例來看。
場景:在瀏覽器中打開google.com并分別搜索3個關鍵字
要完成此方案,以下是我們的腳本必須執行的詳細步驟:
硒 |
QTP |
杰米特 |
下面的代碼顯示了如何在TestNG中不進行參數化的情況下做到這一點。
package parameterization; 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.Test; public class WithoutParameter {WebDriver driver;@Testpublic void noParam(){//Declaring our first keywordString keyWord="Selenium";//Initializing DriverSystem.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");driver = new FirefoxDriver();driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);//Opening search enginedriver.get("https://google.com");//Finding search text box WebElement searchBox = driver.findElement(By.name("q"));//Sending keyword valuesearchBox.sendKeys(keyWord);System.out.println("The search keyword entered is : " +keyWord); //Verifying the keyword on UIAssert.assertTrue(searchBox.getAttribute("value").equalsIgnoreCase(keyWord));driver.quit();} }為了傳遞其他2個關鍵字,我們將不得不再次為字符串' keyWord '用不同的關鍵字值編寫同一段代碼,這將導致冗長且重復的代碼。 而且,將來,如果您必須測試更多的關鍵字值,就必須編寫更多的測試。
現在讓我們通過在testng.xml中繞過這些關鍵字作為參數并在測試中添加@parameters注釋來簡化問題。
Java代碼:
package parameterization; 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.Parameters; import org.testng.annotations.Test;public class ParameterizedClass { WebDriver driver; @Parameters("keyWord")@Testpublic void Parameterpassing(String keyWord){ //Initializing Driver //Mention the path to your local webdriverSystem.setProperty("webdriver.chrome.driver", "D:\\LocalDriver\\chromedriver.exe");driver = new ChromeDriver();driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);//Opening search enginedriver.get("https://google.com");//Finding search text box WebElement searchBox = driver.findElement(By.name("q"));//Sending keyword valuesearchBox.sendKeys(keyWord);System.out.println("The search keyword entered is : " +keyWord); //Verifying the keyword on UIAssert.assertTrue(searchBox.getAttribute("value").equalsIgnoreCase(keyWord));driver.quit();} }這是TestNG.xml,將用于在Selenium自動化測試的TestNG中執行參數化。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="3" parallel="tests" name="suite"><test name="demo1" ><parameter name="keyWord" value="Selenium" /><classes><class name="com.lambdatest.ParameterizedClass"/></classes></test> <!-- Test --><test name="demo2" ><parameter name="keyWord" value="LambdaTest" /><classes><class name="com.lambdatest.ParameterizedClass"/></classes></test> <!-- Test --><parameter name="keyWord" value="Browser Testing" /><test name="demo3" ><classes><class name="com.lambdatest.ParameterizedClass"/></classes></test> <!-- Test --> </suite> <!-- Suite -->現在,您可以運行此測試以檢查是否將我們的參數值傳遞給我們的測試方法,從而獲得了所需的結果。 您可以按照以下步驟運行:
步驟1:在項目瀏覽器中的testng.xml文件上單擊鼠標右鍵,然后單擊“運行方式”:
步驟2:選擇以TestNG Suite運行,您可以看到可通過電子郵件發送的報告或摘要以查看結果。
因此,下一次我們必須針對不同的測試值運行相同的測試,而不是將同一段代碼復制復制到多個文件中,而只需編輯.xml文件,包括更多的值并運行套件。 而已。 這就是通過利用TestNG中的參數化來實現Selenium自動化測試的效率和節省時間的方式。
TestNG中的參數設置是否可以幫助我們進行自動瀏覽器測試?
到目前為止,在此用于參數化的TestNG教程中,您可能已經通過上一節中說明的示例認識到了參數的重要性。 現在,您可能已經在考慮將參數化合并到TestNG腳本中以進行自動瀏覽器測試的方法。 讓我幫助您從一個非常普遍的場景開始,在這個場景中我們需要在多個瀏覽器上執行測試,讓我們看看如何利用參數來執行自動化的瀏覽器測試。
場景:通過將瀏覽器名稱作為參數來打印特定的瀏覽器值。
Java代碼:
package parameterization;import org.testng.annotations.Test;import org.testng.annotations.Parameters;public class ParameterPass {@Parameters("browser")@Testpublic void test1(String browser) {if(browser.equalsIgnoreCase("FF")){System.out.println("The browser value is : " +browser);}else if(browser.equalsIgnoreCase("Chrome")){System.out.println("The browser value is : " +browser);}else if(browser.equalsIgnoreCase("IE")){System.out.println("The browser value is : " +browser);}else{System.out.println("Incorrect browser value passed.");} } }Testng.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"><test name="Firefox Test"><parameter name="browser" value="FF"/><classes><class name="parameterization.ParameterPass"/></classes></test><test name="IE Test"><parameter name="browser" value="IE"/><classes><class name="parameterization.ParameterPass"/></classes></test><test name="Incorrect Browser"><parameter name="browser" value="XYZ"/><classes><class name="parameterization.ParameterPass"/></classes></test></suite>運行上述testng xml時,您將在控制臺中看到以下輸出:
如果查看詳細的結果,您會發現在測試結果摘要中還打印了XML中傳遞的參數值:
可通過電子郵件發送的報告顯示了傳遞給不同測試的不同參數,因此可以更輕松地合并結果:
現在讓我們嘗試將2個參數傳遞給我們的測試,以了解如何利用參數組合進行Selenium自動化測試。 請注意,無論傳遞給測試的參數數量是多少,都需要在測試方法中以正確的順序接受相同數量的參數。
方案:通過傳遞瀏覽器名稱以及URL作為參數來打印特定的瀏覽器和URL值。
package parameterization; import org.testng.annotations.Parameters; import org.testng.annotations.Test;public class ParameterPass_Multiple {@Parameters({"url","browser"})@Testpublic void test1(String url,String browser){if(browser.equalsIgnoreCase("FF")){System.out.println("The browser value is : " +browser);}else if(browser.equalsIgnoreCase("Chrome")){ System.out.println("The browser value is : " +browser); }else if(browser.equalsIgnoreCase("IE")){System.out.println("The browser value is : " +browser);}else{System.out.println("Incorrect browser value passed.");} } }<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"><test name="Firefox Test"><parameter name="url" value="http://www.google.com"/><parameter name="browser" value="FF"/><classes><class name="parameterization.ParameterPass_Multiple"/></classes></test><test name="Chrome Test"><parameter name="url" value="http://www.yahoo.com"/><parameter name="browser" value="Chrome"/><classes><class name="parameterization.ParameterPass_Multiple"/></classes></test> </suite>現在,在運行上述xml時,將生成以下輸出,其中將輸出已傳遞的兩個參數:
電子郵件報告:
在線硒網格的TestNG中的參數化
參數化是使用TestNG構建簡潔的“測試驅動測試”框架的一種巧妙方法。 由您決定如何在TestNG中利用不同類型的參數化,或者在用例需要時同時利用兩者。
下一個要回答的問題是,TestNG中的參數化是否可以與LambdaTest提供的包含2000多種實際瀏覽器的在線Selenium Grid一起使用?
是的,它確實! 實際上,TestNG或任何其他框架中的參數化被認為是在多個不同的測試環境上并行運行測試的最佳方法之一,尤其是在必須定期更改要測試的測試環境的情況下。
例如,讓我們假設您有一個要在多個測試環境上運行的測試,以確保該網頁與跨瀏覽器兼容。 這是自動跨瀏覽器測試的一個典型示例,現在幾乎是每個通過Web開展業務的組織的主要要求。
要在LambdaTest Selenium Grid上運行測試,您需要定義所需的功能對象,該對象指示我們的在線Selenium Grid有關在哪些環境上運行測試的知識。 為此,您可以參數化所需功能對象的值。 例如,考慮以下代碼。 這是一個簡單的腳本,可打開待辦事項列表并執行一些操作。 通過在XML文件中參數化所需功能環境值,可以在多個環境中運行同一腳本。
package com.lambdatest;import java.net.MalformedURLException; import java.net.URL;import org.openqa.selenium.By; //import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.Assert; //import org.testng.annotations.AfterSuite; import org.testng.annotations.Parameters; import org.testng.annotations.AfterTest; //import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test;public class TestNGTodo4 {private RemoteWebDriver driver;private String Status="failed";@BeforeTest@Parameters({ "os", "browser", "version", "build" })public void setup( String os, String browser, String version, String build) throws MalformedURLException {String username = "mudits";String authkey = "kIVQzcwYkSMgZFWoSMxQjcR3ASJo2BIOUQ97GmTwdnPEOFEO2b";String hub = "@hub.lambdatest.com/wd/hub";DesiredCapabilities caps = new DesiredCapabilities();caps.setCapability("platform", os);caps.setCapability("browserName", browser);caps.setCapability("version", version);caps.setCapability("build", build);caps.setCapability("name", "TestNG-Todo-Script-4");caps.setCapability("network", true);caps.setCapability("visual", true);caps.setCapability("video", true);caps.setCapability("console", true);driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps);}@Testpublic void basicTest() throws InterruptedException {String spanText;System.out.println("Loading Url");driver.get("https://4dvanceboy.github.io/lambdatest/todo.html");System.out.println("Checking Box");driver.findElement(By.name("todo-1")).click();System.out.println("Checking Another Box");driver.findElement(By.name("todo-2")).click();System.out.println("Checking Box");driver.findElement(By.name("todo-3")).click();System.out.println("Checking Another Box");driver.findElement(By.name("todo-4")).click();driver.findElement(By.id("todotext")).sendKeys(" List Item 6");driver.findElement(By.id("addbutton")).click();driver.findElement(By.id("todotext")).sendKeys(" List Item 7");driver.findElement(By.id("addbutton")).click();driver.findElement(By.id("todotext")).sendKeys(" List Item 8");driver.findElement(By.id("addbutton")).click();System.out.println("Entering Text");driver.findElement(By.id("todotext")).sendKeys("Get Taste of Lambda and Stick to It");driver.findElement(By.id("addbutton")).click();System.out.println("Checking Another Box");driver.findElement(By.name("todo-9")).click();// Let's also assert that the todo we added is present in the list.spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText();Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText);Status="passed";//Thread.sleep(150);System.out.println("TestFinished");}@AfterTestpublic void tearDown() {driver.executeScript("lambda-status=" + Status);System.out.println(this.getClass().getName());driver.quit();}}Here’s the Corresponding XML file <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="3" parallel="tests" name="suite"><parameter name="build" value="Demo-TestNG" /><test name="demo1" ><parameter name="os" value="windows 10" /><parameter name="browser" value="chrome" /><parameter name="version" value="73" /><classes><class name="com.lambdatest.TestNGTodo4"/></classes></test> <!-- Test --><test name="demo2" ><parameter name="os" value="windows 8.1" /><parameter name="browser" value="firefox" /><parameter name="version" value="59" /><classes><class name="com.lambdatest.TestNGTodo5"/></classes></test> <!-- Test --><parameter name="os" value="macOS Mojave" /><parameter name="browser" value="safari" /><parameter name="version" value="12" /><test name="demo3" ><classes><class name="com.lambdatest.TestNGTodo6"/></classes></test> <!-- Test --> </suite> <!-- Suite -->您是否注意到我如何將Suite標記中的線程數和并行值用于Selenium自動化測試?
上面的腳本將在3個不同的環境中運行相同的測試類,而最好的部分是它們將并行運行。 這意味著所有三個測試將同時執行,從而將您的測試執行時間縮短了很多倍。 感謝Selenium Grid允許我們利用Selenium進行并行測試 。
要考慮的事情
在參加完此TestNG教程之后,到目前為止,您必須對在下一個項目中使用參數進行Selenium自動化測試感到信心滿滿,也許有些激動,但要花一會兒時間。 在使用@Parameters批注時,必須注意幾點。
?如果嘗試將testng.xml中的參數值類型轉換為相應的測試方法參數,則將引發錯誤。 例如,如果您將method參數指定為integer ,但是在TestNG.xml中傳遞了String值,則會出現如下異常:
Testng.xml:
Optional 使用@Optional批注
如果我們在方法中定義的參數未出現在testng.xml中,則將出現testNG異常,并且測試將跳過。 為了克服這種情況,我們可以使用@Optional注釋。 首先讓我們看看它的語法:
@Parameter(“browser”) @Test public void paramCheck(@Optional(“OptionalParameter”) String val)?? { …. }讓我們通過此TestNG教程中的示例深入了解這一點。
Java代碼:
package parameterization; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test;public class optionalParameter { @Parameters("Param One")@Testpublic void testOptionOne(String firstParam){System.out.println("The first parameter is : " +firstParam);}@Parameters("Param Two")@Testpublic void testOptionTwo(@Optional("OptionalParameter")String secondParam){System.out.println("The second parameter is : " +secondParam);} }<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <parameter name="Param One" value="My First Parameter"/> <parameter name="Param Two" value="My Second Parameter"/><test name="Test"><classes><class name="parameterization.optionalParameter"/></classes></test> </suite>運行上述testng.xml時,我們將獲得簡單的結果,其中將顯示第一個和第二個參數,因為這兩個參數均已在XML中明確聲明。 下面的輸出圖像中也顯示了相同的內容。
現在讓我們對xml中的第二個參數進行注釋,并查看@Optional注釋的工作方式:
新的testng.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <parameter name="Param One" value="My First Parameter"/> <!-- <parameter name="Param Two" value="My Second Parameter"/> --><test name="Test"><classes><class name="parameterization.optionalParameter"/></classes></test> </suite>在運行此新XML時,我們看到TestNG中的Optional參數已在現在正在打印的測試方法中聲明,并且在任何地方都沒有拋出異常:
may在某些情況下,您需要使用testng.xml測試參數的多個值。 @Parameters注釋不能達到目的。 我們可以有很多參數,但是每個參數都可以有一個值,從而使我們的代碼可重用。 它更像我們項目的配置文件。 您可以使用多個值作為參數來使用數據提供程序。
該TestNG教程的下一部分將詳細討論數據提供程序及其在Selenium自動化測試中的用法。
使用數據提供程序在TestNG中進行參數化
在上面的部分中,我們看到了如何在框架中使用@Parameters批注來獲得各種結果。 現在,在繼續進行過程中,我們將遇到不得不對多組數據使用測試腳本的情況。 我們可能需要在一次執行中使用龐大的數據集。 這種類型的測試也稱為數據驅動測試,可以通過我們的TestNG框架中的@DataProvider注釋方便地實現。
現在讓我們首先查看@DataProvider批注的語法。
@DataProvider(name=”testData”) public Object[ ][ ] TestDataFeed(){ 在開始使用它在TestNG中進行參數化之前,需要注意兩點,首先,@DataProvider僅具有一個屬性“ name ”。 其次,它是可選的,如果您未指定它,則名稱將與相應的方法名稱相同。
此數據提供程序返回二維數組對象。
讓我們嘗試通過一個簡單的示例來理解這一點,在該示例中,我們嘗試使用數據提供程序傳遞紀念碑和城市名稱。 您可以進一步將此示例用作使用其他電子郵件ID和密碼登錄Gmail或Facebook的基礎。
場景:在瀏覽器中打開google.com并分別搜索3個關鍵字組合。
以下是執行此操作的步驟:
印度門 | 新德里 |
泰姬陵 | 阿格拉 |
查爾·邁納爾 | 海得拉巴 |
Java代碼:
package dataProvider;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.DataProvider; import org.testng.annotations.Test;public class Data_Provider {WebDriver driver;@Test(dataProvider="searchText") public void paramByDataProvider(String monument,String city) throws InterruptedException {//Initializing DriverSystem.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");driver = new FirefoxDriver();//Opening search enginedriver.get("https://google.com");WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(monument +" "+city);System.out.println("You are trying to search " +monument+ " which is in " +city);WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle());driver.quit();}/*Data Provider which returns Object[][] wherein* first column has 'monument' and the second one has 'city'**/@DataProvider(name="searchText")public Object[][] getDataProviderData(){Object[][] searchWords=new Object[3][2];//Enter data into Object ArraysearchWords[0][0]="India Gate";searchWords[0][1]="Delhi";searchWords[1][0]="Taj Mahal";searchWords[1][1]="Agra";searchWords[2][0]="Char Minar";searchWords[2][1]="Hyderabad";return searchWords;} }要運行上面的代碼,我們在TestNG.xml下面使用并像在上面的示例中一樣進行測試:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"><test name="Firefox Test"><classes><class name="parameterization.Data_provider"/></classes></test></suite> <!-- Suite -->我們將收到以下輸出,其中總結了傳遞的數據提供者和相應的結果:
可通過電子郵件發送的報告:
在上面的示例中,我們嘗試了從同一類調用數據提供程序。 您還可以通過簡單地使數據提供者方法靜態化并在測試方法注釋中提供數據提供者類來從另一個類調用數據提供者。 讓我們為數據提供者創建一個不同的類,看看同一示例。
數據提供程序類的Java代碼:
package dataProvider; import org.testng.annotations.DataProvider;public class DataProviderClass {@DataProvider(name="searchText")public static Object[][] getDataProviderData(){Object[][] searchWords=new Object[3][2];//Enter data into Object ArraysearchWords[0][0]="India Gate";searchWords[0][1]="Delhi";searchWords[1][0]="Taj Mahal";searchWords[1][1]="Agra";searchWords[2][0]="Char Minar";searchWords[2][1]="Hyderabad";return searchWords;} }調用數據提供程序的類的Java代碼:
package dataProvider; 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.Test;public class ClassLevelDataProvider {WebDriver driver;@Test(dataProvider="searchText",dataProviderClass=DataProviderClass.class) public void paramByDataProvider(String monument,String city) throws InterruptedException {//Initializing DriverSystem.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");driver = new FirefoxDriver();//Opening search enginedriver.get("https://google.com");WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(monument +" "+city);System.out.println("You are trying to search " +monument+ " which is in " +city);WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle());driver.quit(); } }TestNG.xml運行上面的代碼:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"><test name="Firefox Test"><classes><class name="parameterization.ClassLevelDataProvider"/></classes></test></suite> <!-- Suite -->在跑步時,您可以親自看到我們收到的結果與以前相同。 為了更多地了解我們在自動化中可能遇到的各種情況,重要的是要理解更多一些使用帶有參數viz Method和ITestContext的Data Provider注釋的示例 。
示例1 –在TestNG中使用方法參數
如果我們希望同一個數據提供者為不同的方法工作而不同,例如在為不同的測試方法測試不同的數據集的情況下,我們將在TestNG中使用方法參數。 讓我們看一個遵循以下步驟的示例:
- 檢查方法名稱是否為國內
- 如果是,則返回一組值
- 如果不是,那么另一套價值
Java代碼:
package dataProvider; import java.lang.reflect.Method; 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.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class dataProviders {WebDriver driver;@BeforeMethodpublic void setUp(){//Initializing DriverSystem.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");driver = new FirefoxDriver();//Opening search enginedriver.get("https://google.com");}@AfterMethodpublic void tearDown(){driver.quit();}@Test(dataProvider="destinations")public void domesticMonuments(String monument,String city) throws InterruptedException{WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(monument +" "+city);System.out.println("You are trying to search " +monument+ " which is in " +city); WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle());}@Test(dataProvider="destinations")public void intlDestinations(String location) throws InterruptedException{WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(location);System.out.println("You are trying to search : " +location);WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle()); }@DataProvider(name="destinations")public Object[][] getDataProviderData(Method m){if(m.getName().equalsIgnoreCase("domesticMonuments")){return new Object[][]{{ "India Gate", "Delhi" },{ "Taj Mahal", "Agra" },{ "Char Minar", "Hyderabad" }};}else{return new Object[][]{{"Paris"},{"Cairo"},{"Washington"}};} } }Testng.XML運行上面的代碼:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" ><test name="Firefox Test"><classes><class name="parameterization.dataProviders"/></classes></test></suite>運行xml的結果如下所示,您將能夠看到所使用的數據提供者的詳細信息。
示例2 –在TestNG中使用ITestContext參數
假設我的測試方法分配給不同的組,并且我需要對不同的組使用不同的測試數據。 在這種情況下,我們可以將ITestContext參數與數據提供程序注釋一起使用。 讓我們看一個相同的例子。
Java代碼:
package dataProvider; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.ITestContext; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test;public class ITestContext_DP {WebDriver driver;@BeforeMethod(groups={"One","Two"})public void setUp(){//Initializing DriverSystem.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");driver = new FirefoxDriver();//Opening search enginedriver.get("https://google.com");}@AfterMethod(groups={"One","Two"})public void tearDown(){driver.quit();}@Test(dataProvider="searchKey" , groups="One")public void testMethodOne(String monument,String city) throws InterruptedException{WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(monument +" "+city);System.out.println("You are trying to search " +monument+ " which is in " +city);WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle());} @Test(dataProvider="searchKey" , groups="Two")public void testMethodTwo(String location) throws InterruptedException{WebElement searchBox=driver.findElement(By.name("q"));searchBox.sendKeys(location);System.out.println("You are trying to search : " +location);WebElement srchBtn = driver.findElement(By.name("btnK"));srchBtn.submit();Thread.sleep(3000);System.out.println("The page title is: " +driver.getTitle()); }@DataProvider(name="searchKey")public Object[][] getDataProviderData(ITestContext c){Object[][] grpArr = null;for (String grp : c.getIncludedGroups()){if(grp.equalsIgnoreCase("One")){grpArr = new Object[][]{{ "India Gate", "Delhi" },{ "Taj Mahal", "Agra" },{ "Char Minar", "Hyderabad" }};break;}else if(grp.equalsIgnoreCase("Two")){grpArr = new Object[][]{{"Paris"},{"Cairo"},{"Washington"}};}} return grpArr; } }要調用這個testNG類,可以在xml下面使用,它將基于不同的組運行兩個測試集。
Testng.xml:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" ><test name="First DP Run"><groups><run><include name = "One" /></run></groups><classes><class name="dataProvider.ITestContext_DP"/></classes></test><test name="Second DP Run"><groups><run><include name = "Two" /></run></groups><classes><class name="dataProvider.ITestContext_DP"/></classes></test> </suite>運行上面的xml將產生如下結果:
結論
TestNG中的參數化允許您以更有效的方式執行數據驅動的測試。 通過聲明參數,您不必為單個測試套件的不同測試輸入編寫多個測試自動化腳本,從而使維護維護自動化代碼更容易。 我希望這個TestNG教程能夠幫助您利用Selenium自動化測試腳本。 可以使用DataProvider或帶有TestNG.xml的Parameter批注來完成Selenium自動化測試腳本的TestNG中的參數化。 我們通過示例詳細討論了兩種方式的參數化。 我們意識到DataProvider進一步提供了兩個參數,即Method和ITestContext 。 現在,您可以使用TestNG中的參數化為下一個項目啟動測試自動化腳本。 在下面的評論部分中,讓我知道您對此TestNG教程的想法。 如果您有任何疑問或疑問,請隨時發布。 祝您測試愉快!
翻譯自: https://www.javacodegeeks.com/2019/12/parameterization-in-testng-dataprovider-and-testng-xml-with-examples.html
總結
以上是生活随笔為你收集整理的TestNG中的参数化– DataProvider和TestNG XML(带有示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑cpu拆机散片好吗(为什么组装电脑C
- 下一篇: 联想c200一体机(联想C200一体机拆