Selenium高级 | Selenium使用TestNG的@DataProvider注解实现参数化

2020-09-21 13:59发布

数据驱动测试Data-Drivern testing或者通俗的叫参数化测试是自动化测试中一种比较常见的场景。

本文介绍如何通过TestNG的@DataProvider实现Selenium Java架构中的参数化测试。

理解@DataProvider:

@DataProvider是TestNG中的一个注解,专门用于提供测试数据,此注解标注下的方法需要返回一个Object[][] 类型的值,此值类似于一个二维数组。

被@Test注解标注的方法可以用来接收上面Object[][]中的值,不过要在@Test中指明具体使用的是哪个DataProvider。

步骤:

1. 用@DataProvider注解下的方法提供数据,例:

	@DataProvider(name = "provideUser")	public Object[][] provideData() {		return new Object[][] {			{ "username1", "pw1" },			{ "username2", "pw2" },			{ "username3", "pw3" }		};	}

上例中定义了一个叫“provideUser”的DataProvider,其下的方法提供了三组用户名与密码数据。

2. 在@Test的方法中定义要接收数据的参数,并指明要接收的DataProvider是哪个

@Test(dataProvider = "provideUser")public void openWebSite(String username, String password) throws InterruptedException {		//登录正常操作。。。//输入用户名driver.findElement(By.id("username")).click();driver.findElement(By.id("username")).clear();driver.findElement(By.id("username")).sendKeys(username);//输入密码driver.findElement(By.id("password")).click();driver.findElement(By.id("password")).clear();driver.findElement(By.id("password")).sendKeys(password);//点击登录按钮driver.findElement(By.xpath("//input[@class='logging']")).click();//后续相关操作。。。}

在上面的@Test方法中定义了两个String类型的参数username和password,并且指明了要从DataProvider "provideUser"中获取数据,这样在TestNG运行此脚本时,就会把Object[][]数组中第一列的值传给第一个参数username,第二列的值传给第二个参数password,并且执行完@Test中的所有步骤后,会取下一组参数数据再执行一遍,有几组就重复执行几遍。

下面是一个使用错误密码登录csdn的完整的例子:

package com.yoyotesting.selenium3maven;import org.testng.annotations.Test;import org.testng.annotations.BeforeClass;import org.testng.annotations.DataProvider;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.AfterClass;public class OpenWebsiteTestNG2 {		public WebDriver driver;@BeforeClasspublic void setUp() throws InterruptedException {		//定义gecko driver的获取地址System.setProperty("webdriver.gecko.driver", "D:\\BrowserDriver\\geckodriver.exe");		//创建一个叫driver的对象,启动火狐浏览器  driver = new FirefoxDriver();driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//通过对象driver调用具体的get方法来打开网页driver.get("https://www.csdn.net/"); 	//最大化浏览器窗口driver.manage().window().maximize();Thread.sleep(3000);//点击登录按钮driver.findElement(By.linkText("登录")).click();//点击账号登录driver.findElement(By.linkText("账号登录")).click();}	@DataProvider(name = "provideUser")	public Object[][] provideData() {		return new Object[][] {			{ "username1", "pw1" },			{ "username2", "pw2" },			{ "username3", "pw3" }		};	}@Test(dataProvider = "provideUser")public void openWebSite(String username, String password) throws InterruptedException {		//输入用户名driver.findElement(By.id("username")).click();driver.findElement(By.id("username")).clear();driver.findElement(By.id("username")).sendKeys(username);//输入密码driver.findElement(By.id("password")).click();driver.findElement(By.id("password")).clear();driver.findElement(By.id("password")).sendKeys(password);//点击登录按钮driver.findElement(By.xpath("//input[@class='logging']")).click();//Thread.sleep(3000);String errormessage = driver.findElement(By.id("error-message")).getText();Assert.assertEquals(errormessage,"长时间未修改密码,请修改密码后登录" );}@AfterClasspublic void tearDown() {		//退出浏览器driver.quit();}}

**********************************************************************************************

文章来源:CSDN 作者:YOYO测试

来源地址:https://blog.csdn.net/yoyocat915/article/details/81361572