数据驱动测试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;
@BeforeClass
public 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,"长时间未修改密码,请修改密码后登录" );
}
@AfterClass
public void tearDown() {
//退出浏览器
driver.quit();
}
}
****************************************************************************************************
最近我会持续更新Selenium Java的相关文章,也请大家多多关注我的视频课程
*****************************************************************************************************