一、数据驱动测试概念

数据驱动测试是相同的测试脚本使用不同的测试数据执行,测试数据和测试行为完全分离。

二、实施数据驱动测试的步骤:

1、编写测试脚本,脚本需要支持程序对象、文件或者数据库读入测试数据。

2、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中。

3、运行脚本,循环调用存储在外部介质的测试数据。

4、验证所有的测试结果是否符合期望的结果。

文章转自:https://www.cnblogs.com/davieyang/p/10071209.html

以四个方式展示自动化测试的数据驱动,CSV、Excel、Mysql、数组

1.CSV

testData.csv

代码:

public class TestCSV {

    public WebDriver driver;
String baseUrl = "https://www.sogou.com";
//使用注解DataProcider将数据集合命名为"csvTestData"
@DataProvider(name="csvTestData")
public static Object[][]Words() throws IOException{
//调用类中的今天方法getTestData
return getTestData("D:\\test\\testData.csv");
} @BeforeMethod
public void beforeMethod() {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
driver = new ChromeDriver();
} @Test(dataProvider = "csvTestData")
public void testSearch(String searchWord1, String searchWord2, String searchResult) throws InterruptedException{
driver.get(baseUrl+"/");
driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("stb")).click();
//Assert.assertTrue(driver.getPageSource().contains(searchResult));
Thread.sleep();
}
@AfterMethod
public void afterMethod(){
driver.quit();
} //读取csv文件的静态方法,使用csv文件的绝对文件路径作为函数参数
public static Object[][] getTestData(String filename) throws IOException{
List<Object[]> records = new ArrayList<Object[]>();
String record;
//设定UTF-8字符集,使用带缓冲区的字符输入流BufferedReader读取文件内容
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "gbk"));
//忽略读取csv文件的标题行
file.readLine();
/*
* 遍历读取文件中出去第一行外的其他所有内容
* 并存储在records的ArrayList中
* 每一个records中存储的对象为一个String数组
*/
while((record=file.readLine())!=null) {
String fields[] = record.split(",");
records.add(fields);
}
//关闭文件对象
file.close();
//定义函数反值,即Object[][]
//将存储测试数据的list转换为一个Object的二维数组
Object[][] results = new Object[records.size()][];
//设置二维数组每行的值,每行是一个Object对象
for (int i = ; i<records.size(); i++){
results[i] = records.get(i);
}
return results; }
}

2.数据库

需要增加jar包

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.</version>
</dependency>

创建表语句

create table testdata(
name nvarchar(),
role nvarchar(),
result nvarchar()
)

表数据

代码:

public class TestDB {
public WebDriver driver;
String baseUrl = "http://www.sogou.com";
@DataProvider(name="testdata")
public static Object[][] words() throws IOException{
return getTestData("testdata");
}
@Test(dataProvider = "testdata")
public void testSearch(String searchWord1, String searchWord2, String searchResult){
driver.get(baseUrl + "/");
driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("stb")).click();
//Assert.assertTrue(driver.getPageSource().contains(searchResult));
}
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
driver = new ChromeDriver();
}
@AfterMethod
private void afterMethod(){
driver.quit();
}
public static Object[][] getTestData(String tablename) throws IOException{
//声明Mysql数据库的驱动
String dbDriver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
String user = "root";
String password = "";
//声明存储测试数据的List对象
List<Object[]> records = new ArrayList<Object[]>();
try{
//设定驱动
Class.forName(dbDriver);
Connection conn = DriverManager.getConnection(url,user,password);
if (!conn.isClosed())
System.out.println("连接数据库成功");
//创建statement对象
Statement statement = conn.createStatement();
//拼接sql语句
String sql = String.format("Select * from %s", tablename);
//声明结果集对象rs,用于存储执行sql语句返回的数据结果集
ResultSet rs = statement.executeQuery(sql);
//声明一个ResultSetMetaData对象
ResultSetMetaData rsMetaData = rs.getMetaData();
//调用ResultSetMetaData对象的getColumnCount方法获取数据行的列数
int cols = rsMetaData.getColumnCount();
/**使用next方法遍历数据结果集中的所有数据行*/
while (rs.next()){
//声明一个字符串型数组,数组大小使用数据行的列个数进行声明
String fields[] = new String[cols];
int col = ;
//遍历所有数据行中的所有数据,并存储在字符串数组中
for (int colIdx = ; colIdx<cols; colIdx++){
fields[col] = rs.getString(colIdx+);
col++;
}
//将每一行的数据存储到字符串数组后,存储到records中
records.add(fields);
//输出数据行中的前三列内容,用于验证数据库内容是否正确读取
System.out.println(rs.getString()+" "+rs.getString()+" "+rs.getString());
}
//关闭数据结果集对象
rs.close();
//关闭数据库连接
conn.close();
}catch (ClassNotFoundException e){
System.out.println("未能找到Mysql的驱动类");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
//定义函数返回值,即Object[][]
//将存储测试数据的list转换为一个Object的二维数组
Object[][] results = new Object[records.size()][];
//设置二维数组每行的值,每行是一个Object对象
for (int i = ; i<records.size(); i++){
results[i] = records.get(i);
}
return results;
} }

3.数组

代码:

public class TestArray {
private static WebDriver driver;
@DataProvider(name="searchWords")
public static Object[][] words(){
return new Object[][]{{"蝙蝠侠","主演","迈克尔"},{"超人","导演","唐纳"},{"生化危机","编剧","安德森"}};
}
@Test(dataProvider = "searchWords")
public void test(String searchWord1, String searchWord2, String SearchResult){
System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(, TimeUnit.SECONDS);
driver.get("http://www.sogou.com");
driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("stb")).click();
try{
Thread.sleep();
}catch (InterruptedException e){
e.printStackTrace();
}
//Assert.assertTrue(driver.getPageSource().contains(SearchResult));
driver.quit(); } }

4.excel

所需jar包

    <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

代码:

public class TestExcel {

    public WebDriver driver;
String baseUrl = "http://www.sogou.com";
@DataProvider(name="testData")
public static Object[][] words() throws IOException{
return getTestData("D:\\test", "testData.xlsx", "Sheet1");
}
@Test(dataProvider = "testData")
public void testSearchExcel(String searchWord1, String searchWord2, String searchResult){
driver.get(baseUrl + "/");
driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
driver.findElement(By.id("stb")).click();
//Assert.assertTrue(driver.getPageSource().contains(searchResult));
}
@BeforeMethod
public void beforeMethod(){
System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
driver = new ChromeDriver();
}
@AfterMethod
private void afterMethod(){
driver.quit();
}
public static Object[][] getTestData(String filePath, String fileName, String sheetName) throws IOException{
File file = new File(filePath + "\\" + fileName);
//创建FileInputStream对象用于读取Excel文件
FileInputStream inputStream = new FileInputStream(file);
//声明Workbook对象
Workbook workbook = null;
//获取文件名参数的扩展名,判断是.xlsx文件还是.xls文件
String fileExtensionName = fileName.substring(fileName.indexOf("."));
//如果是.xlsx,则用XSSFWorkbook对象进行实例化,如果是.xls则使用HSSFWorkbook对象进行实例化
if (fileExtensionName.equals(".xlsx")){
workbook = new XSSFWorkbook(inputStream);
}
else if (fileExtensionName.equals(".xls")) {
workbook = new HSSFWorkbook(inputStream);
}
//通过sheetName参数生成Sheet对象
Sheet sheet = workbook.getSheet(sheetName);
//获取Excel数据文件Sheet1中数据的行数,getLastRowNum方法获取数据的最后一行行号
//getFirstRowNum方法获取数据的第一行行号,相减之后算出数据的行数
//Excel行和列都是从0开始
int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();
//创建名为records的list对象来存储从Excel数据文件读取的数据
List<Object[]> records = new ArrayList<Object[]>();
//使用两个for循环遍历Excel数据文件除去第一行外所有数据
//所以i从1开始,而不是从0开始
for (int i = ; i<rowCount+; i++){
Row row = sheet.getRow(i);
//声明一个数组,用来存储Excel数据文件每行中的数据,数组的大小用getLastCellNum办法来进行动态声明,实现测试数据个数和数组大小相一致
String fields[] = new String[row.getLastCellNum()];
for (int j = ; j<row.getLastCellNum();j++){
//调用getCell和getStringCellValue方法获取Excel文件中的单元格数据
fields[j] = row.getCell(j).getStringCellValue();
}
//将fields的数据兑现存储到records的list中
records.add(fields);
}
//定义函数返回值,即Object[][]
//将存储测试数据的list转换为一个Object的二维数组
Object[][] results = new Object[records.size()][];
//设置二维数组每行的值,每行是一个Object对象
for (int i = ; i<records.size(); i++){
results[i] = records.get(i);
}
return results;
}
}

selenium+java 数据驱动的更多相关文章

  1. Selenium WebDriver 数据驱动测试框架

    Selenium WebDriver 数据驱动测试框架,以QQ邮箱添加联系人为示例,测试框架结构如下图,详细内容请阅读吴晓华编著<Selenium WebDiver 实战宝典>: Obje ...

  2. selenium第一课(selenium+java+testNG+maven)

    selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...

  3. Selenium+Java+TestNG环境配置

    1. JDK 2.eclipse+TestNG >TestNG安装.   Name:testng  Location:http://beust.com/eclipse.如图: 3.seleniu ...

  4. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  5. 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试

    在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ...

  6. 行为驱动:Cucumber + Selenium + Java(一) - 环境搭建

    1.1 什么是行为驱动测试 说起行为驱动,相信很多人听说过. 行为驱动开发-BDD(Behavior Driven Development)是一个诞生于2003年的软件开发理念.其关键思想在于通过与利 ...

  7. Selenium+Java的TestNG测试报告优化

    本博主很懒,但学习很勤快,一般能从博客园直接转载的东西,本博主绝不动手写,无奈Selenium+java生成的测试报告在百度上搜索..反正我是没有看到.后来才知道TestNG它可以自动生成测试报告,但 ...

  8. Selenium Java环境配置

    Selenium Java环境配置 上次配置的是C#的环境,今天主要来配置一下Java环境. 首先,对于java环境配置最基础的JDK和JRE 先前我做过配置,这里就不重述了,网上的教程超级多.在基础 ...

  9. selenium+Java使用内容记录(全)

    1.模拟键盘操作,使用enter键 2.等待几秒 3.浏览器最大化 4.获取cookie,删除cookie 5.模拟鼠标 6.selenium+java 识别验证码(数字+字母组合) 7.seleni ...

随机推荐

  1. .NET CORE 使用Dapper连接MSSQL,MYSQL

    Project file: <Project Sdk="Microsoft.NET.Sdk">   <PropertyGroup>     <Outp ...

  2. Epplus DataTable一次性导出

    public void Export() { string fileName = ""; if (string.IsNullOrEmpty(fileName) == true) { ...

  3. node概述

    1.什么是node:“一个搭建在Chrome JavaScript运行时 上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动.非阻塞I/O模型,使它 既轻量又高效,并成为构建运行在 ...

  4. Mac下安装SecureCRT并激活

    今天花了好长的时间终于把SecureCRT安装成功了 现在分享给大家 安装的步骤, 希望对大家用帮助 Mac下的SecureCRT需要破解才能使用 所以有些费劲的.. 先下载SecureCRT和破解文 ...

  5. CentOS 7 搭建Squid代理服务器

    Squid安装 官方地址:http://www.squid-cache.org/ [root@DaMoWang ~]# -r6d8f397.tar.gz [root@DaMoWang ~]# -r6d ...

  6. 从Redis到Codis移植实践

    一.    背景 随着业务的发展,线上Redis的数据越来越多,所以必须考虑扩容的事情了.对于redis的扩容,目前可选的方案有三种:1.client自己做sharding,一般是按key的hash值 ...

  7. sql server中的全局变量,常用的没有多少...以后看看就行

    全局变量格式:  @@*** 这些变量有系统维护,不需要我们自己定义,一般都是用来查看信息. 在存储过程中 用得最多的 @@error,判断有没有错误信息. 一.@@version:查看版本信息 二. ...

  8. Windbg程序调试系列3-线程阻塞问题

    上一篇博文给大家分享了使用Windbg分析内存泄露问题: Windbg程序调试系列2-内存泄露问题 本篇我们继续跟大家分享,如何分析解决线程阻塞问题. 从根本上讲,线程阻塞属于程序Hang的一种,其表 ...

  9. jquery.uploadify上传插件HTML5版中文api使用说明

    插件官网文档:http://www.uploadify.com/documentation/ H5版下载地址:https://download.csdn.net/download/u010075697 ...

  10. idea用到的快捷键

    之前一直用的eclipse,早就听说idea更智能,更便捷,于是,下载了idea,然后再破解,现在就慢慢抛弃eclipse,平时就用idea进行编码. idea的快捷键与eclipse还是有较大不同, ...