数据驱动测试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