需求背景:测试数据的导入一般在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. lombok与spring的恩怨

    下面是lombok按照 Java Bean 的规范生成的 下面是spring mvc里jackson 需要的 xXxx问题还是顺势而为吧

  2. 数据库监听。数据库一次notify,Activity多次接收

    今天项目中发现一个bug: (1)当uri数据库中有更新,会从数据库层DataService中通知应用层,调用notifyChange: mContext.getContentResolver().n ...

  3. if __name__ == "__main__": 的使用

    #!/usr/bin/env python from qq.lib.a2 import register from qq.lib.a3 import login def main(): while T ...

  4. SQl Server Tsql基本编程 ,循环语句 ,存储过程

    一些比较重要但是不一定经常用的 句子 Tsql定义变量 declare @a int :  定义的变量前面必须用@,数据类型是SQL里的数据类型,执行的时候要把需要的有关联的代码一起执行,单独执行一条 ...

  5. vray学习笔记(2)vray工作流程

    在bilibili上面搜索到了一个vray的教程,虽然是英语的,细节方面可能听不太懂,但可以了解整个工作流程,工作流程太重要了,先看下视频的目录: 第1节到第9节都是建模的内容. 第10节和第13节是 ...

  6. 算法Sedgewick第四版-第1章基础-015一stack只保留last指针

    /************************************************************************* * * A generic queue, impl ...

  7. CF609E Minimum spanning tree for each edge

    原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...

  8. beforeFilter()

    在控制器每个动作之前执行,可以方便地检查有效的会话,或者检查用户的权限. function beforeFilter() { parent::beforeFilter(); if(empty($thi ...

  9. Entity Framework Tutorial Basics(31):Migration from EF 4.X

    Migration from Entity Framework 4.1/4.3 to Entity Framework 5.0/6.0 To migrate your existing Entity ...

  10. LeetCode第136题:只出现一次的数字

    问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...