侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

EasyExcel -- 基本使用

一朵云
2021-04-07 / 0 评论 / 2 点赞 / 7722 阅读 / 8550 字

介绍

  EasyExcel是阿里的一个基于Java,简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

  github地址:https://github.com/alibaba/easyexcel
  官网地址:https://alibaba-easyexcel.github.io/docs/current/

使用

  以下是一个基于Maven的Java项目,将简易的演示读写测试用例excel文档的操作过程。

  基本流程为:从“接口测试用例模板.xlsx”中读取测试数据,再将测试结果写入到“接口测试用例.xlsx”中,完成操作。

1、环境准备

  接口简易测试用例:https://cdn.yiduoyun.space/%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%A8%A1%E6%9D%BF.xlsx

2、新建Maven项目并导入依赖

	<!-- EasyExcel的依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

        <!-- 日志依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

        <!-- json解析依赖 -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.0</version>
        </dependency>

3、在resources下新建log4j.properties文件并填写如下

#### 设置###
log4j.rootLogger = INFO,stdout
#log4j.rootLogger = debug,info,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

4、编写Excel对应的实体类

image.png

package com.demo.easyexcel.data;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @author xcj
 * 测试用例excel用例类
 */
@Getter
@Setter
@EqualsAndHashCode
public class ExcelData {

    //接口编号
    @ExcelProperty("接口编号")
    private String interfaceNo;

    //接口域名、IP
    @ExcelProperty("域名/IP")
    private String interfaceIP;

    //接口端口
    @ExcelProperty("端口")
    private String interfacePort;

    // 接口地址
    @ExcelProperty("接口地址")
    private String interfaceAddress;

    //用例编号
    @ExcelProperty("用例编号")
    private String caseNo;

    //用例名称
    @ExcelProperty("用例名称")
    private String caseName;

    //接口类型
    @ExcelProperty("接口类型")
    private String interfaceType;

    //头部参数
    @ExcelProperty("headers")
    private String headers;

    //测试数据
    @ExcelProperty("测试数据")
    private String testData;

    //关联数据,用于接口数据关联传递
    @ExcelProperty("关联数据")
    private String associatedData;

    //预期结果
    @ExcelProperty("预期结果")
    private String expectedResults;

    //实际结果
    @ExcelProperty("实际结果")
    private String actualResults;

    //是否验证sql
    @ExcelProperty("是否验证sql")
    private String ifVerifySql;

    //执行sql
    @ExcelProperty("执行sql")
    private String executeSql;

    //预期sql结果
    @ExcelProperty("预期sql结果")
    private String expectedSqlResults;

    //实际sql结果
    @ExcelProperty("实际sql结果")
    private String actualSqlResults;

    //用例状态
    @ExcelProperty("用例状态")
    private String caseStatus;

    //执行人
    @ExcelProperty("执行人")
    private String expecteMan;

    //执行时间
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    @ExcelProperty("执行时间")
    private Date executionTime;

    //备注
    @ExcelProperty("备注")
    private String remarks;

}

4、将测试用例文件放置在src\main\resources路径下

image.png

5、编写Excel操作类

读取接口测试用例模板内容进行测试,然后将结果内容写入新的xlsx文件。

package com.demo.easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.demo.easyexcel.data.ExcelData;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * @author xcj
 * Excel操作
 */
@Slf4j
public class Main {

    final static int SIZE = 2;

    static List list = ListUtils.newArrayListWithExpectedSize(SIZE);

    public static void main(String[] args) throws IOException {
        operation();
    }

    public static void operation() throws IOException {

        //这个是测试用例模板(不进行变更)
        String fileName = new File("").getCanonicalPath() + "\\src\\main\\resources\\接口测试用例模板.xlsx";
        String fileName2 = new File("").getCanonicalPath() + "\\src\\main\\resources\\接口测试用例.xlsx";

        // 这里 需要指定写用哪个class去写
        try (ExcelWriter excelWriter = EasyExcel.write(fileName2, ExcelData.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("模块啊").build();

            // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
            // 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行
            EasyExcel.read(fileName, ExcelData.class, new PageReadListener<ExcelData>(dataList -> {
                for (ExcelData excelData : dataList) {
                    log.info("读取到一条数据{}", new Gson().toJson(excelData));
                    //todo 1、将读到的测试用例数据进行http请求

                    //todo 2、将http请求得到的结果与用例预期结果进行比较

                    //todo 3、接口响应结果比较通过,则判断是否需要校验sql,需要则校验

                    //todo 4、以上都验证通过后,则将测试结果写入excel中(包括“实际结果”、“sql实际结果”、“用例状态”、“执行时间”、“关联数据”)
                    //模拟测试不通过,写结果进excel
                    excelData.setCaseStatus("不通过");
                    excelData.setExecutionTime(new Date());
                    list.add(excelData);

                    //达到预期值就批量写入excel
                    if (list.size() > SIZE) {
                        excelWriter.write(list, writeSheet);
                        // 存储完成清理 list
                        list = ListUtils.newArrayListWithExpectedSize(SIZE);
                    }
                }
                //将剩余不足SIZE数量的list存储一下
                excelWriter.write(list, writeSheet);
            })).sheet().doRead();
        }
    }
}

6、最终结果

image.png

2

评论区