(二)java+testng实现接口的批量测试的实现_数据源Excel的读写

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);
	}
}

你可能感兴趣的:(接口自动化测试)