读取Excel,通过Testng完成数据驱动
背景
数据驱动是我们写自动化脚本非常常用的技术,而Testng中数据驱动常用的注解是 @DataProvider,但是这个方法必须返回一个Object[][]。最近常有学生问起,如果通过外部文件作为数据源,从而实现数据驱动。 例如数据源为Excel时,如何读取excel完成数据驱动呢? 简单思路就是,读取excel数据,excel数据第一行作为map的Key其它行为值,放入map并返回。 @DataProvider 注解对应方法去获取调读取excel方法,拿到返回的Object[][],其余都一样使用。
ps.代码是不值钱的,关键是解决问题的思路。
Demo
话不多说,直接上Demo。
1.准备Excel数据

- 新建maven工程,并导入 poi相关包:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
3.读取Excel数据,并放入Map中返回。
/**
* @param file 读取某个excel文件
* @return Object
*/
public Object[][] testData(String file) {
ArrayList<String> arrkey = new ArrayList<String>();
Workbook workbook = WorkBookEhi.getWorkbook(file);
Sheet sheet = workbook.getSheetAt(0);
// 获取总行数
int rowTotalNum = sheet.getLastRowNum()+1;
// 总列数
int columns = sheet.getRow(0).getPhysicalNumberOfCells(); HashMap<String, String>[][] map = new HashMap[rowTotalNum - 1][1];
// 对数组中所有元素hashmap进行初始化
if (rowTotalNum > 1) {
for (int i = 0; i < rowTotalNum - 1; i++) {
map[i][0] = new HashMap();
}
} else {
log.error("测试的Excel" + file + "中没有数据");
}
// 获得首行的列名,作为hashmap的key值
for (int c = 0; c < columns; c++) {
String cellvalue = CellUnit.getCellValue(sheet, 0, c);
arrkey.add(cellvalue);
}
// 遍历所有的单元格的值添加到hashmap中
for (int r = 1; r < rowTotalNum; r++) {
for (int c = 0; c < columns; c++) {
String cellvalue = CellUnit.getCellValue(sheet, r, c);
map[r - 1][0].put(arrkey.get(c), cellvalue);
}
}
return map; }
当然这个这里面的getWorkbook()方法我也是经过封装了,代码如下:
/**
* 创建 workbook
*
* @param filePath excel文件路径
* @return Workbook 对象
* @throws IOException
*/
public static Workbook getWorkbook(String filePath) {
Workbook wb = null;
try {
if (filePath.endsWith(".xls")) {
File file = new File(filePath);
InputStream is = new FileInputStream(file);
wb = new HSSFWorkbook(is);
} else if (filePath.endsWith(".xlsx") || filePath.endsWith(".xlsm")) {
wb = new XSSFWorkbook(filePath);
}
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
CellUnit.getCellValue()方法封装如下:
/**
* 通过sheet 行号和列返回值
*
* @param sheet sheet name
* @param rowNum 行号
* @param cellNum 列号
* @return
*/
public static String getCellValue(Sheet sheet, int rowNum, int cellNum) {
Cell cell = sheet.getRow(rowNum).getCell(cellNum);
String value = CellUnit.getCellValue(cell);
return value;
} CellUnit.getCellValue() 方法封装如下:
/**
* 把不同类型的单元格转换成字符串,并返回
*
* @param cell cell
* @return 当个单元格值
*/ public static String getCellValue2(Cell cell) {
String value = "";
switch (cell.getCellTypeEnum()) {
case STRING:
value = String.valueOf(cell.getRichStringCellValue());
return value;
case NUMERIC:
value = String.valueOf(cell.getNumericCellValue());
return value;
case BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
return value; case FORMULA:
value = String.valueOf(cell.getCellFormula());
return value; case ERROR:
value = String.valueOf(cell.getErrorCellValue());
return value;
case BLANK:
return value;
default:
log.warn("未知该单元格类型");
return value; }
}
4.Testng 使用数据
@DataProvider(name = "testData")
public Object[][] data() {
TestCaseExcel testcase = new TestCaseExcel();
return testcase.testData(file);
} @Test(dataProvider = "testData")
public void testCase(HashMap<String, String> data) {
String fileName = data.get("excelName");
String bpSheetName = data.get("Benefits Package Sheet");
int bpRowNum = Integer.parseInt(data.get("BP sheet RowNum"));
String csvSheetName = data.get("Cost Share Variances Sheet");
int csvRowNum = Integer.parseInt(data.get("CSV Sheet RowNum"));
String hiosPlanID = data.get("HIOS Plan ID");
String isPass = data.get("isPass");
作者:博客已迁移I米阳
链接:https://www.jianshu.com/p/895e4c118db9
来源:简书
读取Excel,通过Testng完成数据驱动的更多相关文章
- java结合testng,利用excel做数据源的数据驱动实例
数据驱动部分,是自动化测试常用部分,也是参数化设计的重要环节,前面分享了,mysql.yaml做数据源,那么再来分享下excel做数据驱动 思路: 先用POI读取excel.解析读取数据,返回list ...
- selenium webdriver读取excel进行数据驱动测试
最近做自动化需要从文件读取数据做参数化,网上发现一个不错的解决方案. 准备:新建一个excel文件,文件名为测试类名,sheet名为测试方法名 excel第一行为标题,从第二行开始为测 ...
- testNg自动化,读取excel的数据
自己写了一个testng执行excel用例的小程序,主要是运行.xlsx的,需要支持xls可以自己扩展,分享一下.下载地址:http://yun.baidu.com/share/link?sharei ...
- Selenium+TestNG+CSV数据驱动
1.工程的目录结构: # saas SAAS_UI自动化测试工程 # 一.工程的目录结构 1.saas/src是工程的入口 a.saas/src/main/java/com/saas/encapsul ...
- 读取excel表格以及生成自动化报告
数据库读取 标签(空格分隔): 数据库读取 读excel数据xlrd 当登录的账号有多个的时候,我们一般用excel存放测试数据,本节课介绍,python读取excel方法,并保存为字典格式. 1.先 ...
- poi读取excel元素
Java读取excel元素 忽略元数据末尾回到原数据开始处 pom文件设置 <dependency><groupId>org.apache.poi</groupId> ...
- Selenium应用代码(读取excel的内容进行注册的案例)
1. 封装读取excel数据的方法:import java.io.*;import java.util.ArrayList;import java.util.List; import jxl.*;im ...
- Jmeter读取excel表中用例数据实现接口压测
传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data ...
- 基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)
之前,我们使用了读取XML文件的方式来实现页面元素的读取,并做成了基础页面类.下面,我们来进行一些扩展,通过Excel来读取页面元素. Excel的使用,大多数人应该都不陌生.那么Java读取Exce ...
随机推荐
- BZOJ1396 识别子串 和 BZOJ2865 字符串识别
字符串识别 2865: 字符串识别 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 261[Submit][Status][D ...
- 神经网络(12)--具体实现:如何对back propagation的正确性进行验证
我们在进行back propagation时难免会出现各种各样的问题,当出现问题的时候,我们的cost function仍然是随着迭代的次数下降的,但是这中间会有一些问题存在,那么我们如何来检查我们的 ...
- C# 6.0 中的新增功能(.NET Framework 4.6 与 Visual Studio 2015 )
C#6.0 在 2015 年7月随着.NET Framework 4.6 一同发布,后期发布了.NET Framework 4.6.1,4.6.2. 一.自动属性初始化(Auto-property i ...
- 题解 UVa10780
题目大意 多组数据,每组数据给定两个整数 \(m,n\),输出使 \(n\%m^k=0\) 的最大的 \(k\).如果 \(k=0\) 则输出Impossible to divide. 分析 计数水题 ...
- Java - 框架之 SpringMVC
一. 简单配置 (XML) 1. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-ap ...
- PHP流程控制之for循环控制语句
王同学反复往返与北京和大连,并且在本上记录往返次数.在PHP中还有另外一种实现方式能够实现同样的计数.无锡大理石测量平台 for 循环是 PHP 中的一种计数型循环,它的语法比较数活多变.这是一个必须 ...
- 搭建使用PHPstorm环境
本周学习内容: 1.学习PHP: 2.复习技能表: 3.学习正则表达式: 实验内容: 1.安装PHPstorm环境,破解PHPstorm: 2.PHPstorm运行PHP代码 3.PHPstorm安装 ...
- PHP文件载入
一.介绍 在实际开发中,经常会在一个PHP文件中引入其他的文件,被引入的文件可以是HTML文档,也可以是PHP文件 二.语法 require(文件名)和require_once(文件名) includ ...
- Python之☞网络编程中一些概念问题(未完)
:::一些名词的解释::: 网络: 网络是辅助双方能够连接在一起的工具,使用网络的目的,为了联通多方然后进行通讯,能够让软件在不同的电脑上运行,相互传输数据. 网络协议: 约定俗成的,没有理由. TC ...
- CAN信号转以太网究竟怎么回事?TCP转CAN又是什么?
首先说说can总线. can总线是目前工业控制领域应用最广的现场总线,它可以实现远距离信息的传输,是各种设备和各类功能部件之间传送信息的公用通道,它是由导线组成的传输线束,用于连接体统中的各个节点,传 ...