需求背景:测试数据的导入一般在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. NodeJs之项目构建(对文件及文件夹的操作)

    前提:需要使用:require('fs')引入外部模块 简单的模仿创建一个文件下有多个文件. 首先,准备一个主文件夹 然后,准备放在这个主文件夹下的文件加 在代码中通过对象,数字,json对象来装 代 ...

  2. TCS3200颜色传感器测试实验

    TCS3200颜色传感器测试实验 2013-08-02 17:18:24 分享: 标签:  Arduino  TCS3200  传感器 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAO ...

  3. CentOS6.5安装完没有网络的解决办法

    昨天下了个CentOS 6.5 Minimal 版,在VMware 10下安装好了之后,发现上不了网,PING外网也PING不通. 在网上搜了一下,发现Linux安装好了之后,网卡默认是没有启动的,下 ...

  4. CentOS7:ifconfig command not found解决和netstat -an

    没有 ifconfig 和netstat -an 的话安装 net-tools package yum install net-tools

  5. ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)

    ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 1 ...

  6. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

  7. spoj1716 Can you answer these queries III

    传送门 (分析见正睿2018.10.1笔记) 代码 #include<iostream> #include<cstdio> #include<cstring> #i ...

  8. jqgrid列动态加载

    private void InitGrid(string entityName) { Session["entityName"] = entityName; ArrayList c ...

  9. 《Spring实战》-1

    1.Spring的主要特性:依赖注入DI和面向切面编程AOP. 2.关键策略: 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码:切面和模板 3.Spri ...

  10. 多线程学习-基础(七)sleep()和wait()的区别

    一.sleep()和wait()的区别共同点:1.他们都是在多线程的环境下,都可以在程序的调用出阻塞指定的毫秒,然后继续往后执行(在当前线程再次拿到cpu的执行权之后).2.wait()和sleep( ...