1、接口用例编写在excel中。
2、解析excel文件,存放到实体类中
3、对数据进一步帅选,得出想要的测试数据,封装到对象中,然后再放到list集合中
4、接口用例执行就结束后,将需要回写的数据存放到对象中,然后添加到集合中。最后再统一执行写回excel表格的操作。
package com.lemon.apiAuto.Util;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import com.lemon.apiAuto.pojo.Api;
import com.lemon.apiAuto.pojo.Case;
import com.lemon.apiAuto.pojo.WriteBackData;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
public class ExcelUtil {
public static void main(String[] args) {
}
// excel路径
public static String excelPath = PropertiesUtil.getPath("excelPath");
// 读取接口信息的数据保存到list中
public static List<Api> apiList = readExcel(excelPath, "接口信息", Api.class);
// 读取用例信息的数据保存到list中
public static List<Case> caseList = readExcel(excelPath, "用例", Case.class);
public static List<WriteBackData> wbdList = new ArrayList<WriteBackData>();
/**
* 根据apiId获取Case和Api关联的数据
*
* @param apiId 用例编号
* @return
*/
public static Object[][] getApiAndCaseByApiId(String apiId) {
// 满足条件的apiList
List<Api> wantApiList = new ArrayList<Api>();
// 满足条件的caseList
List<Case> wantCaseList = new ArrayList<Case>();
// 遍历api list,如果apiId是我们需要的接口编号,则将Api对象保存到新的集合中
for (Api api : apiList) {
if (apiId.equals(api.getApiId())) {
// 把符合条件的api保存到新的list集合里面
wantApiList.add(api);
break;// 找到这个api,则中断循环
}
}
// 遍历caseList,如果apiId是我们需要的接口编号,则将CASE对象保存到新的集合中
for (Case case1 : caseList) {
if (apiId.equals(case1.getApiId())) {
wantCaseList.add(case1);
}
}
// 定义一个二维数组,把list数据转换成二维数组,给数据提供者使用
Object[][] obj = new Object[wantCaseList.size()][2];
// 数组长度为用例行的长度
for (int i = 0; i < wantCaseList.size(); i++) {
// 第i行第一列保存api对象
obj[i][0] = wantApiList.get(0);
// 第i行第2列保存case对象
obj[i][1] = wantCaseList.get(i);
}
return obj;
}
/**
* easyPoi读取数据保存到list中
*
* @param startSheetIndex 读取的sheet
* @param clazz
* @return
*/
public static <T> List<T> easyReadExcel(String excelPath, int startSheetIndex, Class<T> clazz) {
FileInputStream is = null;
// 定义一个list集合,泛型为T
List<T> list = null;
try {
// 创建一个输入流
is = new FileInputStream(new File(excelPath));
// 创建importparams对象
ImportParams params = new ImportParams();
// 设置sheetIndex的值
params.setStartSheetIndex(startSheetIndex);
list = ExcelImportUtil.importExcel(is, clazz, params);
// 返回list集合
return list;
} catch (Exception e) {
e.printStackTrace();
}
close(is);
return null;
}
public static void close(Closeable close) {
// 关闭流
if (close != null) {
try {
close.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param excelPath 文件路径
* @param sheetName 表单名称
* @param clazz 字节码对象
* @return
*/
public static <T> List<T> readExcel(String excelPath, String sheetName, Class<T> clazz) {
FileInputStream is = null;
try {
// 创建一个文件对象
File file = new File(excelPath);
// 创建一个输入流
is = new FileInputStream(file);
// 创建一个workbook对象
Workbook workbook = WorkbookFactory.create(file);
// 获取sheet表单
Sheet sheet = workbook.getSheet(sheetName);
// 获取表头
Row startRow = sheet.getRow(0);
// 定义一个数组保存第一行的数据
String startRowArra[] = new String[startRow.getLastCellNum()];
// 取出第一行所有列的数据
for (int i = 0; i < startRow.getLastCellNum(); i++) {
Cell cell = startRow.getCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String value = cell.getStringCellValue();
// 通过截取获得英文名,保存第一行的数据至数组中,
startRowArra[i] = value.substring(0, value.indexOf("("));
}
// 定义二维数组保存
T obj = null;
List<T> list = new ArrayList<T>();
// 从第二行开始,遍历所有的行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
// 创建对象
obj = clazz.newInstance();
// 获取行对象
Row row = sheet.getRow(i);
// 获取的列数保存在数组中
// 定义以为数组保存列内容
// 遍历所有的列
for (int j = 0; j < row.getLastCellNum(); j++) {
// 获取列对象
Cell cell = row.getCell(j, MissingCellPolicy.CREATE_NULL_AS_BLANK);
// 设置单元格格式
cell.setCellType(CellType.STRING);
// 获取单元格的内容
String value = cell.getStringCellValue();
// 通过第一行的数组,加工生成method方法
String methodName = "set" + startRowArra[j];
// 通过反射获取方法名
Method method = clazz.getDeclaredMethod(methodName, String.class);
// 反射调用方法
method.invoke(obj, value);
// 通过反射,设值给对象的属性
}
// 对象保存到集合中
list.add(obj);
}
// 返回集合
return list;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close(is);
}
return null;
}
/**
* 批量回写数据
*
* @param excelPath excel路径
* @param sheetName sheet表单名称
* @param cellNum 回写的列
* @param writeBackList 回写的数据列表
*/
public static void writeBackData(String excelPath, String sheetName, int cellNum,
List<WriteBackData> writeBackList) {
FileInputStream is = null;
FileOutputStream os = null;
try {
is = new FileInputStream(excelPath);
// 获取工作簿
Workbook workbook = WorkbookFactory.create(is);
// 获取sheet
Sheet sheet = workbook.getSheet(sheetName);
for (WriteBackData wbd : writeBackList) {
// 获取row
Row row = sheet.getRow(wbd.getRowNum());
// 获得cell
Cell cell = row.getCell(cellNum);
// 设置格式
cell.setCellType(CellType.STRING);
// 设置单元格的 内容
cell.setCellValue(wbd.getContent());
}
os = new FileOutputStream(excelPath);
workbook.write(os);
} catch (EncryptedDocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关流
close(is);
close(os);
}
}
/**
* 回写的路径,数据 默认为本类的成员变量,
*
* @param sheetName
* @param cellNum
*/
public static void writeBackData(String sheetName, int cellNum) {
writeBackData(excelPath, sheetName, cellNum, wbdList);
}
}