import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.testng.Assert;
import jxl.*;

/**
* Excel放在Data文件夹下 Excel命名方式:测试类名.xls Excel的sheet命名方式:测试方法名 Excel第一行为Map的key
*
* @ClassName: ExcelDataProvider
* @Description: TODO(读取Excel数据)
* 设计思想:一个Excel文本代表一个测试类,一个sheet代表一个测试方法,一个Excel文本中拥有多个sheet(
* 即一个类中多个测试方法)
*/
public class ExcelData implements Iterator<Object[]> {

private Workbook book = null;
private Sheet sheet = null;
private int rowNum = 0;
private int currentRowNo = 0;
private int columnNum = 0;
private String[] columnnName;

/* 构造方法:初始化一个Excel文本对象,并获取key值 */
public ExcelData(String classname, String methodname) {

try {

int dotNum = classname.indexOf(".");

if (dotNum > 0) {
classname = classname.substring(classname.lastIndexOf(".") + 1, classname.length());
}
// 从/data文件夹下读取以类名命名的excel文件
String path = "C:/Users/Administrator/Desktop/" + classname + ".xls";
InputStream inputStream = new FileInputStream(path);

book = Workbook.getWorkbook(inputStream);
// 获取单个sheet
sheet = book.getSheet(methodname);
// 获取sheet里的所有行
rowNum = sheet.getRows();
// 获取第一行(即key)所有的单元格
Cell[] cell = sheet.getRow(0);
// 第一行所有单元格的长度
columnNum = cell.length;
// 创建一个以第一行所有单元格长度为长度的String类型的数组:columnnName
columnnName = new String[cell.length];
// 将第一行所有单元格里的内容(即key)存放到数组:columnnName中
for (int i = 0; i < cell.length; i++) {
columnnName[i] = cell[i].getContents().toString();
}
// 每一行存放完毕后,自动指向下一行
this.currentRowNo++;

} catch (Exception e) {
e.printStackTrace();
Assert.fail("unable to read Excel data");
}
}

/* 重写hasNext()方法,用于判断是否存在下一行 */
public boolean hasNext() {
// 若当前sheet中没有任何内容,或者当前行号指向的行超出了当前sheet中的最大的行,结束读取数据
if (this.rowNum == 0 || this.currentRowNo >= this.rowNum) {

try {
book.close();
} catch (Exception e) {
e.printStackTrace();
}
return false;
} else {
// sheet下一行内容为空判定结束
if ((sheet.getRow(currentRowNo))[0].getContents().equals(""))
return false;
return true;
}
}

/* 重写next()方法,用于获取当前行所有单元格里面的内容 */
public Object[] next() {
// 获取当前行所有单元格对象
Cell[] c = sheet.getRow(this.currentRowNo);
Map<String, String> data = new HashMap<String, String>();
// 将单元格中的所有内容存放到map中,并指定key与value的对应关系
for (int i = 0; i < this.columnNum; i++) {

String temp = "";

try {
temp = c[i].getContents().toString();
} catch (ArrayIndexOutOfBoundsException ex) {
temp = "";
}
data.put(this.columnnName[i], temp);
}
// 创建一个只有一个元素的Object类型的数组,用于存放单次获取的key与value值
Object object[] = new Object[1];
object[0] = data;
this.currentRowNo++;
return object;
}

public void remove() {
throw new UnsupportedOperationException("remove unsupported.");
}
}

单元测试、自动化测试、接口测试过程中的Excel数据驱动(java实现)的更多相关文章

  1. 接口开发中 遇到的坑——Java byte与C# byte 数据转换问题

    前提: 公司与其他公司进行接口对接 需要使用Byte[]数据流传输数据 原本想法如下:直接IO生成就ok了 using System; using System.IO; using System.Te ...

  2. 如何记录selenium自动化测试过程中接口的调用信息

    上一篇博客,我写了python自动化框架的一些知识和粗浅的看法,在上一篇中我也给自己提出一个需求:如果记录在测试过程中接口的调用情况?提出这个需求,我觉得是有意义的.你在测试过程中肯定会遇到一些莫名其 ...

  3. Web自动化框架LazyUI使用手册(8)--excel数据驱动详解(ExcelDataProvider)

    概述 框架提供了excel数据驱动方式运行测试用例的工具,本文将针对数据驱动,进行详细演示. 详见类:lazy.test.ui.browser.ExcelDataProvider 被测对象: http ...

  4. 调用获取学生信息的接口,保存到excel里面

    # 2.http: // doc.nnzhp.cn / index.php?s = / 6 & page_id = 14# 调用获取学生信息的接口,保存到excel里面 import requ ...

  5. SpringBoot中关于Excel的导入和导出

    前言   由于在最近的项目中使用Excel导入和导出较为频繁,以此篇博客作为记录,方便日后查阅.本文前台页面将使用layui,来演示对Excel文件导入和导出的效果.本文代码已上传至我的gitHub, ...

  6. 【转】js 中导出excel 较长数字串会变为科学计数法

    [转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...

  7. 在VBA中调用excel函数

    以前不太会用VBA时,都是在excel中使用函数来计算一些数据.毕竟函数不如代码,效率比较低.所以,就学着怎么在VBA中引用Excel函数.平时我用得比较多的函数就是countif和sumif函数.1 ...

  8. UpdatePanel 中 导出Excel按钮

    UpdatePanel 中 导出Excel按钮 要加 Triggers </ContentTemplate> <Triggers> <asp:PostBackTrigge ...

  9. asp.net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

随机推荐

  1. 11.hibernate的连接查询

    1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...

  2. 9.hibernate的一对一映射

    一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...

  3. 把嵌入在eclipse中的tomcat日志分离出来

    现象 不知道从哪个版本的tomcat开始,windows版本的tomcat不再包含{tomcat_home}\logs\catalina.out这个文件,eclipse中配置好tomcat服务器之后, ...

  4. 在 iOS 应用中直接跳转到 AppStore 的方法

      找到应用程序的描述链接,在itunes中找到相应的应用,(如下图),点击免费右边的下方向键,选择复制链接,就拿到了对应的app的描述链接 比如:https://itunes.apple.com/c ...

  5. juniper防护墙接口的NAT和ROUTE模式如何选择问题

    juniper防护墙一般是把trust接口部署为NAT模式,untrust接口部署为route模式.这样当来自内部的数据访问Utrust区域时,会把源地址翻译成untrust接口的地址.从而达到隐藏内 ...

  6. 生成SQL脚本的方法

    2点需要注意的关键: (1)选择特定数据库对象不包含用户选项: (2)要编写脚本的数据的类型选择"架构和数据".

  7. 阅读《大道至简第一章》读后感(java伪代码)

    大道至简讲述的是软件工程实践者的思想,书的第一章引用了著名的----愚公移山这一历史故事,向我们讲述了编程的精义.汤问篇中所述的愚公移山这一事件,我们看到了原始需求的产生---“惩山北之塞,出入之迂” ...

  8. Python基础篇-day4

    本节目录: 1.字符编码 2.函数 2.1参数 2.2变量 2.3返回值 2.4递归 2.5 编程范式 2.6 高阶函数 *************************************** ...

  9. 嵌套json的查询

    postgres=# SELECT  t.data->'objects'->1->'src' AS ctFROM   reports as t     , json_array_el ...

  10. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...