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中实现参数化。

  1. 使用“参数注释”和TestNG XML文件。
  2. 使用“ DataProvider批注”。

使用@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个关键字

要完成此方案,以下是我们的脚本必须执行的详细步骤:

  1. 启动浏览器并打开www.google.com。
  2. 在搜索框中添加第一个关键字作为输入,然后点击搜索。
  3. 验证UI上的输入值是否与测试数据相同。
  4. 对其他2个关键字重复上述两个步骤。

搜寻关键字

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个关键字组合。

以下是执行此操作的步骤:

  1. 启动浏览器以打开www.google.com。
  2. 搜索第一个关键字组合。
  3. 获取页面标题。
  4. 重复上述步骤,即对其他2个关键字组合使用2和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 MethodITestContext的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进一步提供了两个参数,即MethodITestContext 。 现在,您可以使用TestNG中的参数化为下一个项目启动测试自动化脚本。 在下面的评论部分中,让我知道您对此TestNG教程的想法。 如果您有任何疑问或疑问,请随时发布。 祝您测试愉快!

翻译自: https://www.javacodegeeks.com/2019/12/parameterization-in-testng-dataprovider-and-testng-xml-with-examples.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zbrush 添加纹理贴图_想学习3D游戏模型,3Dmax、MAYA和ZBrush都需要掌握吗?

想从事游戏行业的建模的话&#xff0c;模型和贴图的知识都得学&#xff0c;MAYA和3DMAX只能说是基本要学的&#xff0c;Zbrush能够提升个人价值&#xff0c;之后能给你建好的模型做出好看的贴图&#xff0c;才能算是一个游戏建模方面能干活的合格从业人员。新手入门的话&#x…

file.getpath_Java中File的getPath(),getCanonicalPath()和getAbsolutePath()之间的区别...

file.getpathFile API在Java中非常重要&#xff0c;因为它使文件系统可以访问Java程序。 尽管Java的文件API丰富&#xff0c;但是使用它们时仍需要了解很多细节。 关于文件路径的常见查询程序员之一是getPath() &#xff0c; getCanonicalPath()和getAbsolutePath()方法之间的区…

linux 在线帮助,linux获取在线帮助

Linux系统的帮助文档非常丰富。帮助手册提供命令的使用说明。比如你若是想了解ls命令的用法&#xff0c;只需运行&#xff1a;$ man ls帮助手册旨在提供基础知识和参考信息&#xff0c;有时会有一些实例和交叉索引&#xff0c;但是基本没有那种教程式的文档。帮助手册会按系统排…

linux中samba详解,详解linux系列之samba的安装及配置

上篇博文中我介绍了FTP&#xff0c;今天我们来介绍一下samba实现文件共享。这个比FTP更好点&#xff0c;因为对用户的权限可以通过samba权限和系统权限交叉使用&#xff0c;取最严格的。可以让windows更容易的从linux系统上存取文件&#xff0c;还有samba也可以让linux上面的打…

使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务

微服务架构不是免费的午餐 &#xff01; 微服务需要解耦&#xff0c;灵活&#xff0c;操作透明&#xff0c;数据感知和弹性。 过去几年的大多数材料仅讨论具有紧密耦合且不可扩展的技术&#xff08;如REST / HTTP&#xff09;的点对点体系结构。 这篇博客文章介绍了Apache Kafk…

单片机控制三相异步电动机正反转c语言程序,请用PLC控制一台普通三相异步电动机的正反转控制,设计其控制程序梯形图及主电路...

PLC的编程方法及步骤。总的步骤主要有三步&#xff1a;一、根据电路图选择电器元件及PLC的型号&#xff0c;其中包括确定PLC的输入输出点位、确定PLC的输出类型&#xff0c;也需考虑某些功能是否能扩展、价格等&#xff1b;二、设计好PLC控制的外围元器件的原理图。这里面包括有…

0x80070003系统找不到指定路径_Win7系统中gpedit.msc找不到应该如何解决?

Win7x系统gpedit.msc找不到怎么办&#xff1f;最近有用户反映&#xff0c;电脑当中的gpedit.msc找不到了&#xff0c;gpedit.msc就是我们的策略组&#xff0c;对于我们的电脑来说是非常重要的&#xff0c;那么gpedit.msc找不到应该如何解决呢&#xff1f;接下来就为大家分享win…

c语言回文数递归,c语言问题~~~回文数!!急,拜托高人指点!!

满意答案wyhjjq12014.01.27采纳率&#xff1a;53% 等级&#xff1a;12已帮助&#xff1a;10413人添加上满足你补充要求的C程序:#includeint palindrome(unsigned int x){unsigned int y;unsigned int s0;yx;while(y>0){ss*10y%10;yy/10;}if(sx)return 1;elsereturn 0;}vo…

jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第一部分)

jboss架构&#xff08;文章来宾与北美红帽公司高级中间件顾问约翰赫洛克 &#xff08; John Hurlocker&#xff09;合着&#xff09; 在这周的技巧中&#xff0c;我们将放慢速度&#xff0c;并仔细研究可能的Red Hat JBoss BRMS部署体系结构。 在谈论部署体系结构时&#xf…

snvr client怎么使用_TCGA官方工具gdc-client.exe的安装及使用

在TCGA数据下载过程中&#xff0c;会提示使用Download a manifest for use with theGDC Data Transfer Tool​gdc.cancer.gov实现过程&#xff1a;1.下载gdc-client的压缩文件&#xff1b;gdc-client_v1.4.0_Windows_x64.zip2.将上述压缩文件copy到一个英文文件名称的文件夹内&…

js时间选择器_Vuestic Admin一款免费与美妙基于Vue.js开发的管理模板

Vuestic Admin 简介vuestic admin是一款流行&#xff0c;免费与美妙的基于Vue.js开发出来的管理模板&#xff0c;包括38以上个定制用户界面组件&#xff0c;由Epicmax开发,由Vasili Savitski设计。目前github star 6K, 最新版本2.0.0, MIT许可协议。为什么选择Vuestic AdminVue…

linux内核之旅ppt_微软Windows 10防病毒现已可用Linux上

微软在推出预览版应用程序几个月后&#xff0c;刚刚宣布了适用于Linux的Microsoft Defender ATP的全面可用性。“ Microsoft Defender ATP将Linux添加到现有的本机支持平台的选择中&#xff0c;对我们所有客户而言都是重要的时刻。它使Microsoft Defender安全中心成为真正的统一…

Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试

在上一篇文章中&#xff0c;我们已经开始讨论基于消息的通信中的消费者驱动的合同测试 。 在今天的帖子中&#xff0c;我们将在测试工具箱中包含另一个工具&#xff0c;但是在此之前&#xff0c;让我对显微镜下的系统进行快速回顾。 它有两项服务&#xff0c; 订单服务和货运服…

Android两个tab吸顶,Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每

Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每个页面的内容适配高度这几天 朋友问我了个问题 有个特别的需求 页面如下就是当viewpager里面的当前页面内容足够多的时候 要去能滑上去 并且指示…

html5input输入框设置无边框_芯片充电两大改变,无看点的iPad8,上手体验发现并不简单!...

前不久&#xff0c;苹果召开了秋季新品发布会&#xff0c;但与以往不同的是&#xff0c;往年本该成为“配角”的iPad&#xff0c;没想到此次成为了主角之一&#xff0c;面对着外观不变仅升级芯片新发布的iPad 8&#xff0c;大家好像没有过多的激情&#xff0c;”旧瓶装新酒“的…

android系统三防机,这才是真正给老人设计的智能手机:三防+安卓系统+超大音量,AGM H2...

原标题&#xff1a;这才是真正给老人设计的智能手机&#xff1a;三防安卓系统超大音量&#xff0c;AGM H2在这个互联网时代&#xff0c;很多智能手机厂商&#xff0c;都是在硬件配置上面进行比拼&#xff0c;包括但是不限于处理器的升级&#xff0c;摄像头的升级&#xff0c;散…

spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构

spring aop 注释下一篇文章将演示如何使用Spring AOP和注释编写简单的审计。 审核机制将是干净&#xff0c;高效且易于维护的&#xff08;和Kewwl&#xff01;&#xff09;。 我将在用户管理系统上演示我的示例&#xff08;假设您具有反射和AOP的一般知识&#xff09;。 我们…

springboot 打包_springboot打包-体积太大怎么办

springcloud项目打包动辄100多兆&#xff0c;在文件上传部署的时候非常耗时&#xff0c;多数情况下是毫无意义的耗时&#xff0c;因为依赖包很多情况下不需要改变&#xff0c;只是修改了业务逻辑&#xff0c;那么每次打包上传的时间都浪费了&#xff0c;尤其在开发环境下&#…

.vue文件_Spring Boot 2.x(十六):玩转vue文件上传

为什么使用Vue-Simple-Uploader 最近用到了Vue Spring Boot来完成文件上传的操作&#xff0c;踩了一些坑&#xff0c;对比了一些Vue的组件&#xff0c;发现了一个很好用的组件——Vue-Simple-Uploader&#xff0c;先附上gayhub的&#xff0c;再说说为什么选用这个组件&#xf…

成为Java流专家–第2部分:中级操作

就像魔术棒一样&#xff0c;中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起&#xff0c;以可读有效的方式执行从简单到高度复杂的任务。 本文是五分之二&#xff0c;其中还有一个GitHub存储库&#xff0c;其中包含每个单元的说明和练习。 第…