需求背景:测试数据的导入一般在dataprovider中写入对应的测试数据,当参数较多,组合测试或者接口参数测试的测试数据都需要逐一写数据驱动类,数据准备消耗了大量时间。前一篇博客中介绍了对偶测试的小工具,可以通过变量取值情况直接生成excel形式的测试数据,那么本文将介绍将生成的测试数据作为dataprovider导入到测试类中,通过这种方式,可以极大降低重复工作,提高工作效率。

要把大象装冰箱的三步:

1、配置文件pom.xml中加入 
        <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
           <version>3.15</version>
        </dependency>
ps:你懂的,读取excel这种一定要来个依赖包的,这个poi就提供API给java程序读取Microsoft Office格式档案读和写的功能。版本的话,大家与时俱进~~~。
 
2、写个函数调用依赖包里面的方法读取excel中的数据。
package com.netease.vcloud.vod.dataprovider;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import org.testng.annotations.DataProvider;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
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.ss.usermodel.WorkbookFactory;
public class MyDataProvider {
   @DataProvider(name = "MyDataProvider")
    public static Object[][] getTestData() {
            String excelPath    = "D:\\testcase\\input.xlsx";
            String excelSheet   = "test1";
            int rowIndex = 0;
            int colIndex = 0;
            Sheet naviSheet = getSheet(excelPath, excelSheet);
            int iLastRowIndex = naviSheet.getLastRowNum();
            Row row = naviSheet.getRow(0);
            int lastColIndex = row.getLastCellNum();
            Object excelData[][] = new Object[iLastRowIndex+1][lastColIndex];
            for (rowIndex = 0; rowIndex <= iLastRowIndex; rowIndex++) {
                for (colIndex = 0; colIndex < lastColIndex; colIndex++) {
                    Cell cell = getCell(naviSheet, rowIndex, colIndex);
                    String paramValue = getCellValue(cell);
                    excelData[rowIndex][colIndex] = paramValue;
                }
            }
            return excelData;
    }
 
    /**
    * @Title: getSheet
    * @Description: Get the sheet from Excel
    * @return: Sheet
    */
    private  static Sheet getSheet(String path, String sheetname){
        InputStream fs = null;
        Sheet naviSheet = null;
        try {
            fs = new FileInputStream(path);
            Workbook wb = WorkbookFactory.create(fs);
            naviSheet = wb.getSheet(sheetname);
        }catch(IOException e)
        {
            e.printStackTrace();
        }catch(InvalidFormatException e)
        {
            e.printStackTrace();
        }
        finally {
            try {
                fs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        return naviSheet;
    }
 
    /**
    * @Title: getSheet
    * @Description: Get the Cell from Excel
    * @return: Cell
    */
    private static Cell getCell(Sheet sheet, int rowIndex, int columnIndex) {
        Row row = sheet.getRow(rowIndex);
        if (row == null) {
            row = sheet.createRow(rowIndex);
        }
        Cell cell = row.getCell(columnIndex);
        if (cell == null) {
            cell = row.createCell((short) columnIndex);
        }
        return cell;
    }
 
    /**
    * @Title: getCellValue
    * @Description: Get the Cell value from Excel
    * @return: String
    */
    private static String getCellValue(Cell cell) {
        String arg = "";
        DecimalFormat df = new DecimalFormat("#");
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            arg = (cell == null ? "" : cell.getStringCellValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            Double dvalue = (cell == null ? 0 : cell.getNumericCellValue());
            arg = String.valueOf(dvalue);
            if(arg.matches("\\d+.[0]*"))
            {
                int endIndex = arg.indexOf(".");
                arg = arg.substring(0, endIndex);
            }
            if(arg.matches("^((-?\\d+.?\\d*)[Ee]{1}(\\d+))$"))
            {
                arg = df.format(dvalue);
            }
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            Boolean bool = (cell == null ? false : cell.getBooleanCellValue());
            arg = bool.toString();
            break;
        case Cell.CELL_TYPE_FORMULA:
            arg = (cell == null ? "" : cell.getCellFormula());
            break;
        case Cell.CELL_TYPE_ERROR:
            arg =  (cell == null ? "" : Byte.toString(cell.getErrorCellValue()));
            break;
        case Cell.CELL_TYPE_BLANK:
            arg = "";
            break;
        }
        return arg;
    }
 
}
ps:MyDataProvider把excel中的数据一个一个读出来,作为数据驱动哦,源码奉上,简单快捷,也可自己定制需求,按需读取~~~。
 
3、测试类中导入测试数据
package com.netease.vcloud.vod.testcase;
 
import org.testng.annotations.Test;
import com.netease.vcloud.vod.dataprovider.MyDataProvider;
 
public class MyTester {
 
    @Test(dataProvider = "MyDataProvider", dataProviderClass = MyDataProvider.class)
    public void runTest(String id, String name, String input, String expected) {
 
            System.out.println("Got one test data.");
            System.out.println("id:["+id+"]");
            System.out.println("name:["+name+"]");
            System.out.println("input:["+input+"]");
            System.out.println("expected:["+expected+"]");
 
    }
}
输出:

ps:是不是很简单~!再给大家对比一下原有excel中的数据:

 

果然一行一行的导进去了!

机智的盆友会问,对偶测试中有很多无用的数据或者行的标题和头,这怎么处理呢?读取规则自定义呀~写函数定义从生成的测试数据开始读取就可以了,或者心狠手辣的童鞋直接把无用的字段删除,像我一样.....
 
要结合对偶测试自动生成excel哦,这样才能最大程度上解放劳动力,但需要自己设计的输入数据也完全可以手动敲进去。希望大家用的开心,用的愉快~!

excel测试数据导入的更多相关文章

  1. python生成excel测试数据

    在功能测试时,经常会测到excel文件导入导出的功能,导入与导出时,需要测试系统单次导入大批量数据时是否正常, 如果系统承受不起太大的数据导入,则需要开发限制单次导入的数量,以防止系统服务异常.大量的 ...

  2. Access中一句查询代码实现Excel数据导入导出

    摘 要:用一句查询代码,写到vba中实现Excel数据导入导出,也可把引号中的SQL语句直接放到查询分析器中执行正 文: 导入数据(导入数据时第一行必须是字段名): DoCmd.RunSQL &quo ...

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

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

  4. kettle将Excel数据导入oracle

    导读 Excel数据导入Oracle数据库的方法: 1.使用PL SQL 工具附带的功能,效率比较低 可参考这篇文章的介绍:http://www.2cto.com/database/201212/17 ...

  5. excel的导入导出的实现

    1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...

  6. 使用NPOI组件完成的Excel导出导入(附源代码,测试通过)

    最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦! 对于NPOI这个组 ...

  7. 订餐系统之Excel批量导入

    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...

  8. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  9. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

随机推荐

  1. linux环境下Apache+Tomcat集群配置

    写在前面 apache配置多个tomcat,实现请求分流,多个tomcat服务均衡负载,增加服务的可靠性.最近研究了一下,遇到许多问题,记录一下,方便以后查阅,不喜欢apache,nginx也是可以做 ...

  2. 12-01Js对象##正则表达式##

    正则表达式:是一个字符一个字符的验证,通过量词验证字符串: 1.什么是RegExp?RegExp是正则表达式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量 ...

  3. 1106SQLserver基础--变量、运算符的使用,if...else,while语句

    数据库---变量(对数据库中的数据没有任何影响) 作用:临时存储数据的作用,起一个衔接的作用,为了方便理解存储过程. 例:Declare @hello varchar(20) Set @hello=’ ...

  4. pipeline(管道的连续应用)

    # -*- coding: utf-8 -*- """ Created on Tue Aug 09 22:55:06 2016 @author: Administrato ...

  5. EF CODEFIRST WITH ORACLE 存储过程

    EF  CODEFIRST WITH ORACLE 解决存储过程一直没找到解决方案 所以最后也没办法还是用了最基本的解决方案 采用Oracle.ManagedDataAccess提供的ADO基础访问类 ...

  6. 2018网络预选赛 徐州G 线段树

    线段树,假设求(x1,y1)点的贡献,就找所有比该点出现时间晚,且x坐标大于x1的点中y最大的,贡献就是Y-y1,由于题目条件限制,不可能有x坐标大于(x1,y1)且y坐标大于y1的点,所以贡献肯定为 ...

  7. 什么是FastCGI, PHP-FPM

    CGI,FastCGI都是一套接口标准:是编程语言(比如php,python; python里面也有wsgi)与web服务器(比如Nginx)的通信标准(比如你跟老外交流,那么FastCGI就相当于是 ...

  8. 71-n皇后

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. 杭电acm 1038题

    本题比较简单,但是需要掌握几个小技巧,先上代码 /************************************* 杭电ACM 1038题,已AC ********************* ...

  10. ld 链接选项-L,-rpath-link,-rpath

    转载自:http://blog.csdn.net/q1302182594/article/details/42102961 1. 三个C文件 1. world.c #include<stdio. ...