需求背景:测试数据的导入一般在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. scrapy-redis源码抛析

    #scrapy-redis--->queue.py-->class FifoQueue 队列 LifoQueue(lastinfirstout栈) #self.server父类Base中链 ...

  2. javascript删除option选项的多种方法总结

    转自:https://blog.csdn.net/xiaoxuanyunmeng/article/details/16886505 1. JavaScript 代码如下: var oSel=docum ...

  3. ssh框架整合其他方式(没有hibernate核心配置文件)

  4. SQL serve 数据库--视图、事物、分离附加、备份还原

    视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态生成.  视图只能用来查询,不能增删改:不允许出现重复列 ...

  5. idea 修改Recent projects

    idea用了一段时间了,打开的项目多了,导致Open Recent列表中的项目也非常多,在找一个项目时很不方便. 后来查询,在~/Library/Preferences/IntelliJIdea目录/ ...

  6. noi.ac day6t3 color

    传送门 分析 将询问离线,枚举右端点.新加入一个右端点i时,假设离i第t近的同色位置为p,t+1近的是q,则当i是右端点时,(q,p]的点可以作为左端点. 注意对于一个点离它第t近的同色点可以用队列维 ...

  7. 常用Git命令清单

    我现在工作几乎每天都使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用 ...

  8. WPF之MVVM模式(2)

    我们都想追求完美 Every view in the app has an empty codebehind file, except for the standard boilerplate cod ...

  9. MongoDB 分片2

    mongodb 在windows下面进行分片 mongodb 更新很快,在做分片的时候,查找了不少文章,但是很多已经过时了.现在把我搭建的过程及命令分享给大家.我用的是最新版本windows版3.4. ...

  10. 删除XML文档中某节点

    前几天Insus.NET在写了一系列XML文档进行操作.创建 <怎样创建XML文档> http://www.cnblogs.com/insus/p/3276944.html       & ...