数据驱动测试是自动化测试的主流设计模式之一,相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离,这样的测试脚本设计模式称为数据驱动。
实施数据驱动测试的步骤:
1.编写测试脚本,脚本需要支持程序对象、文件或者数据库读入测试数据;
2.将测试脚本使用的数据测试数据存入程序对象、文件或者数据库等外部介质中;
3.运行脚本,循环调用存在外部介质的测试数据;
4.验证所有的测试结果是否符合期望的结果。
下面分别使用4种方式实现数据驱动测试
1.使用TestNG进行数据驱动测试
2.使用CSV文件进行数据驱动测试
3.使用Excel文件进行数据驱动测试
4.使用Mysql数据库实现数据的驱动测试
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* @DataProvider注解的使用
* 使用DataProvider提供数据有两种形式:
* 第一种:一种是在测试代码和测试数据放在同一个类中;
* 第二种:把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护。
*/
public class DataProviderTest {
private static WebDriver driver;
// @DataProvide 作为数据提供者,提供几组数组,则引用他的test方法就会执行几次
// @DataProvide 注解定义当前方法中的返回值对象作为测试脚本的测试数据集,并将测试数据集命名为searchWords
@DataProvider(name="searchWords")
public static Object[][] words(){
return new Object[][]{{"蝙蝠侠","主演","迈克尔"},{"超人","导演","唐纳"},{"生化危机","编剧","安德森"}};
}
//方法中的3个参数分别使用searchWords测试数据集中的每个一维数组中的数据进行赋值,此测试方法会被调用3次
@Test(dataProvider="searchWords")
public void test(String searchWords1, String searchWords2, String SearchResult){
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys(searchWords1 +" "+ searchWords2);
driver.findElement(By.id("su")).click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(searchWords1 +">>>>" +searchWords2+">>>>"+SearchResult);
//判断搜索结果中是否包含测试数据中期望的关键词
Assert.assertTrue(driver.getPageSource().contains(SearchResult));
driver.quit();
}
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
driver = new ChromeDriver();
}
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* 测试数据与测试脚本分离的方式
*/
public class DataProviderCSVTest {
public static WebDriver driver;
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
driver = new ChromeDriver();
}
@DataProvider(name="testData")
public static Object[][] words() throws IOException{
return getTestData("F://testData.csv");
}
@Test(dataProvider="testData")
public void test(String searchWord1,String searchWord2,String searchResult){
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys(searchWord1+""+searchWord2);
driver.findElement(By.id("su")).click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Assert.assertTrue(driver.getPageSource().contains(searchResult));
driver.quit();
}
//读取CSV文件的方法
public static Object[][]getTestData(String fileName) throws IOException {
//定义一个集合,存csv文件中的数据
List
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* 使用Excel文件进行数据驱动测试
* 需引入POI jar包
* @author Administrator
*
*/
public class DataProviderExcelTest {
public static WebDriver driver;
String url = "http://www.baidu.com";
@DataProvider(name="testData")
public static Object[][] words() throws IOException{
return getTestData("f://","testData.xlsx","Sheet1");
}
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
driver = new ChromeDriver();
}
@AfterMethod
public void AfterMethod(){
driver.quit();
}
@Test(dataProvider="testData")
public void test(String searchWord1,String searchWord2,String searchResult){
driver.get(url);
driver.findElement(By.id("kw")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("su")).click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Assert.assertTrue(driver.getPageSource().contains(searchResult));
}
//从excel中获取测试数据的方法
public static Object[][] getTestData(String filePath,String fileName,String sheetName) throws IOException{
//声明一个file文件对象
File file = new File(filePath+"\\"+fileName);
//读取文件
FileInputStream in = new FileInputStream(file);
//声明Workbook对象
Workbook workbook = null;
//获取文件的扩展名
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if(fileExtensionName.equals(".xlsx")){
//.xlsx类型文件
workbook = new XSSFWorkbook(in);
}else {
//.xls类型的文件
workbook = new HSSFWorkbook(in);
}
//通过sheetName,生成Sheet对象
Sheet sheet = workbook.getSheet(sheetName);
//读取sheet1中数据的行数,最后一行减去第一行
int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
//将excel中的数据存在list中
List records = new ArrayList();
//遍历每行数据,去除第一行表头数据,excel的行号与列号都是从0开始
for(int i=1;i<=rowCount;i++){
//获取行对象
Row row = sheet.getRow(i);
//声明一个数组存放读取的行数据,数组大小用getlastCellNum确定
String fields[] = new String[row.getLastCellNum()];
//遍历每列数据
for(int j=0;j
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* 使用Mysql数据库实现数据的驱动测试
*/
public class DataProviderMysqlTest {
public WebDriver driver;
String url = "http://www.baidu.com";
@DataProvider(name="testData")
public Object[][] words() throws IOException{
return getTestData("search");
}
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
driver = new ChromeDriver();
}
@AfterMethod
public void afterMethod(){
driver.quit();
}
@Test(dataProvider="testData")
public void test(String searchWord1,String searchWord2,String searchResult){
driver.get(url);
driver.findElement(By.id("kw")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("su")).click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Assert.assertTrue(driver.getPageSource().contains(searchResult));
}
//获取Mysql数据库中的测试数据
public static Object[][] getTestData(String tableName) throws IOException{
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/bbs";
String username = "root";
String password = "123";
List records = new ArrayList();
try {
//加载数据库驱动
Class.forName(driver);
//获取数据库连接
Connection connection = DriverManager.getConnection(url,username,password);
//创建statement对象
Statement statement = connection.createStatement();
//准备sql语句
String sql = "select argument1,argument2,result from " + tableName ;
//用statement对象执行sql语句
ResultSet rs = statement.executeQuery(sql);
//获取ResultSetMetaData对象
ResultSetMetaData reMetaData = rs.getMetaData();
//调用getColumnCount()获取所有字段的数目(列数)
int columnCount = reMetaData.getColumnCount();
while(rs.next()){
String fields[] = new String[columnCount];
int column = 0;
//遍历所有行数据的所有列数据,并存字符数组中
for(int columnIndex = 0; columnIndex < columnCount; columnIndex ++){
fields[column] = rs.getString(columnIndex +1);
column ++;
}
records.add(fields);
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
rs.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
// 定义方法的返回值,将list转换为Object二维数据
Object[][] results = new Object[records.size()][];
// 设置二维数每行的值,每行是一个Object对象
for (int i = 0; i < records.size(); i++) {
results[i] = (Object[]) records.get(i);
}
return results;
}
}
感谢每一个认真阅读我文章的人!!!
我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。
Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628