java接口自动化系列(04):读取数据文件并封装对象
本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/15867903.html
实现目标
把excel中数据读取出来,并封装到对象中,这样注入测试数据到测试方法的时候,一次注入一个对象,而不用写很多参数,另外,获取测试数据(比如url等),直接通过对象的get方法就可以很方便的获取到。
添加pom依赖
操作excel的依赖
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
测试数据文件放caseData目录
caseData.xlsx

修改testng.xml
指定参数:数据文件路径、用例sheet名、常用变量sheet名
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="apiAutoTest" verbose="1">
<parameter name="variableSheetName" value="variables"/>
<test name="register-login-add-findByName" enabled="true"> <!--test必须有name属性-->
<parameter name="excelPath" value="caseData/caseData.xlsx"/>
<parameter name="dataSheetName" value="case"/>
<classes>
<class name="com.qzcsbj.autotest.testcase.BaseCase"/>
</classes>
</test>
</suite>
创建实体类
用例
package com.qzcsbj.autotest.entity;
/**
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <case类>
*/
public class CaseData {
private String caseId;
private String apiName;
private String describe;
private String url;
private String requestType;
private String headers;
private String cookies;
private String parameters;
private String uploadFile;
private String initSql;
private String globalVariables;
private String assertFields;
public String getCaseId() {
return caseId;
}
public void setCaseId(String caseId) {
this.caseId = caseId;
}
public String getApiName() {
return apiName;
}
public void setApiName(String apiName) {
this.apiName = apiName;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getHeaders() {
return headers;
}
public void setHeaders(String headers) {
this.headers = headers;
}
public String getCookies() {
return cookies;
}
public void setCookies(String cookies) {
this.cookies = cookies;
}
public String getParameters() {
return parameters;
}
public void setParameters(String parameters) {
this.parameters = parameters;
}
public String getUploadFile() {
return uploadFile;
}
public void setUploadFile(String uploadFile) {
this.uploadFile = uploadFile;
}
public String getInitSql() {
return initSql;
}
public void setInitSql(String initSql) {
this.initSql = initSql;
}
public String getGlobalVariables() {
return globalVariables;
}
public void setGlobalVariables(String globalVariables) {
this.globalVariables = globalVariables;
}
public String getAssertFields() {
return assertFields;
}
public void setAssertFields(String assertFields) {
this.assertFields = assertFields;
}
@Override
public String toString() {
return "CaseData{" +
"caseId='" + caseId + '\'' +
", apiName='" + apiName + '\'' +
", describe='" + describe + '\'' +
", url='" + url + '\'' +
", requestType='" + requestType + '\'' +
", headers='" + headers + '\'' +
", cookies='" + cookies + '\'' +
", parameters='" + parameters + '\'' +
", uploadFile='" + uploadFile + '\'' +
", initSql='" + initSql + '\'' +
", globalVariables='" + globalVariables + '\'' +
", assertFields='" + assertFields + '\'' +
'}';
}
}
常用变量
package com.qzcsbj.autotest.entity;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
public class Variable {
private String name;
private String value;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Variable{" +
"name='" + name + '\'' +
", value='" + value + '\'' +
", description='" + description + '\'' +
'}';
}
}
创建工具类
ExcelUtil.java,读取excel文件中的数据
package com.qzcsbj.autotest.utils;
import com.qzcsbj.autotest.entity.CaseData;
import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <解析指定excel表单的数据,封装到对象中:使用泛型可以处理不同类型的对象,返回泛型集合>
*/
public class ExcelUtil {
public static Logger logger = Logger.getLogger(ExcelUtil.class);
// 解析指定excel表单的数据,封装到对象中【对象类型使用泛型】
public static <T> List<T> loadExcel(String excelPath, String sheetName, Class<T> clazz){
logger.info("===================开始读取sheet: " + sheetName);
// 创建一个list
List<T> list = new ArrayList<T>();
InputStream in = null;
// 创建WorkBook对象
try {
File file = new File(excelPath);
in = new FileInputStream(file);
// 获取workbook对象
Workbook workbook = WorkbookFactory.create(in);
// 获取sheet对象
Sheet sheet = workbook.getSheet(sheetName);
// 获取第一行,Row是行对象类型,通过行对象可以操作列
Row firstRow = sheet.getRow(0);
// 获取最后一列的列号
int lastCellNum = firstRow.getLastCellNum();
// System.out.println(lastCellNum);
// 定义存放表头的数组
String[] titles = new String[lastCellNum];
// 将表头放入数组
for (int i = 0; i < lastCellNum; i++) {
// 通过行对象和列索引,获取单元格对象
Cell cell = firstRow.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
// 设置列的类型为字符串
// cell.setCellType(CellType.STRING);
// 获取单元格的值
String title = cell.getStringCellValue();
// title = title.substring(0,title.indexOf(":"));
// 值保存到数组
titles[i] = title;
}
// 打印解析出来的标题
// logger.info("解析出来的首行标题:" + Arrays.toString(titles));
// 获取sheet最后一行的行号
int lastRowNum = sheet.getLastRowNum();
// System.out.println(lastRowNum);
// 循环处理每一行数据,从2行开始是数据行
for (int i = 1; i <= lastRowNum ; i++) {
// 每行数据一个对象
T obj = clazz.newInstance();
// 获取一行数据
Row rowData = sheet.getRow(i);
if (rowData==null || rowDataIsEmpty(rowData)){
continue;
}
// 获取此行的列数据,封装到caseObject对象中
for (int j = 0; j < lastCellNum ; j++) {
Cell cell = rowData.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String cellValue = cell.getStringCellValue();
// 打印获取到的值
// System.out.print("【"+ titles[j] + "="+ cellValue+"】");
// 获取要反射的方法名
String methodName = "set" + titles[j];
// 获取要反射的方法对象
Method method = clazz.getMethod(methodName, String.class);
// 反射调用
method.invoke(obj, cellValue);
}
// logger.info("封装的第【"+i+"】个对象(也就是第"+i+"行数据):" + obj);
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
logger.info("===================读取sheet完成: " + sheetName);
return list;
}
// 判断行的单元格数据是否都是空
public static boolean rowDataIsEmpty(Row rowData) {
int lastCellNum = rowData.getLastCellNum();
for (int i = 0; i < lastCellNum; i++) {
Cell cell = rowData.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String cellValue = cell.getStringCellValue();
if (cellValue!=null && cellValue.trim().length()>0){
return false;
}
}
return true;
}
}
修改测试类
执行测试用例前,先从数据文件读取数据
package com.qzcsbj.autotest.testcase;
import com.qzcsbj.autotest.entity.CaseData;
import com.qzcsbj.autotest.entity.Variable;
import com.qzcsbj.autotest.utils.ExcelUtil;
import org.apache.log4j.Logger;
import org.testng.annotations.*;
import org.testng.annotations.Optional;
import java.util.*;
/**
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <BaseCase>
*/
public class BaseCase{
public static Logger logger = Logger.getLogger(BaseCase.class);
// 保存所有用例对象
public static List<CaseData> cases = new ArrayList<CaseData>();
// 存放变量对象的列表
public static List<Variable> variables = new ArrayList<Variable>();
@Parameters({ "excelPath", "dataSheetName", "variableSheetName"})
@BeforeTest
public void readDataFromExcel(@Optional("caseData/caseData.xlsx") String excelPath, @Optional("case") String dataSheetName, @Optional("variables") String variableSheetName){
logger.info("excelPath: " + excelPath);
logger.info("dataSheetName: " + dataSheetName);
logger.info("variableSheetName: " + variableSheetName);
cases = ExcelUtil.loadExcel(excelPath, dataSheetName, CaseData.class);
variables = ExcelUtil.loadExcel(excelPath, variableSheetName, Variable.class);
logger.info("读取文件获取到的cases对象:" + cases);
logger.info("读取文件获取到的variables对象:" + variables);
}
}
结果演示
运行xml文件


通过上面结果可以看到,数据已经读取成功并保存到对象中。
__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号