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. Ambari中添加新服务

    官网: https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=38571133 一.背景 栈的定义可以在源代码树中找到/am ...

  2. MT4 图表上设置字符

    ; int start() { //---- ObjectCreate(, , ); string str = "<"; string show ; ;i<x;i++) ...

  3. NOIP2011-普及组复赛模拟试题-第二题-买票

    题目背景 Background Ztc真的遇上黄牛了...  题目描述 Description   周末Ztc想去剧场看演出,但是他没有票.这时,救世主Wzj出现了,他慷慨地愿意卖给Ztc一些票.   ...

  4. mybatis的insert返回主键

    <insert id="insert" useGeneratedKeys="true" keyProperty="id" parame ...

  5. WimTool(Wim映像处理工具) V1.30.2011.501 免费绿色版

    软件名称: WimTool(Wim映像处理工具) V1.30.2011.501 免费绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinX ...

  6. Win7的64位系统如何搭建安卓Android开发环境

    在搭建安卓Android开发环境,那么现在比较主流的Win7的64位操作系统如何搭建呢?其实很简单,不需要设置任何环境变量,只需要下载两个程序包(ADT和JDK),下载的时候注意选择相应的64位程序包 ...

  7. 笔记一:OOAD与UML

    一.面向对象的概念与方法 1.  面向对象 1.1. 面向对象是一种系统建模技术 1.2. 面向对象编程是按照OO的方法学来开发程序的过程 1.3. 通过分析系统内对象的交互来描述或建模一个系统 1. ...

  8. Find and run the whalesay image

    Find and run the whalesay image People all over the world create Docker images. You can find these i ...

  9. angularJS 系列(七)---指令

    ----------------------------------------------------------------------------------- 原文:https://www.s ...

  10. Android中的Fragment页面切换和selector选择器

    效果如图: 提示:下面是用的整个的图片 下面看代码: //--------------------这是主页面布局文件----------------------- <?xml version=& ...