出品|軟件測試網
項目背景
系統有個Excel導入功能,需要通過Excel來構造測試數據,生成測試數據之后,上傳Excel并導入驗證。
如果數據驗證出錯,需要給出錯誤提示;如果數據校驗通過,則執行導入操作。
我們主要通過的Easy Excel框架來做。
期望的生成Excel數據模板如下:
生成了人員的工號、姓名、證件類型、身份證、民族等等字段。
這里我們使用java語言,用到的工具類如下:
java-faker
構造測試數據時,需要絞盡腦汁浪費時間,可以釋放你的生產力。
easy-excel
easy-excel重寫了poi對07版Excel的解析,能夠原本一個3M的Excel用POI sax依然需要100M左右內存降低到幾M,并且再大的Excel不會出現內存溢出。
03版依賴POI的sax模式,在上層做了模型轉換的封裝,讓使用者更加簡單方便。
作用類上,生成所有成員變量的/方法,作用于成員變量上,生成該成員變量的/方法獲取網站完整源碼工具,可以設定訪問權限及是否懶加載等。
代碼解析
代碼調用鏈
我們先從最底層的Model層來說:以一個項目模板為例,構建Model,此時一個Excel的sheet,就對應一個model。
這里我們需要注意的是 @ 和 @注解:
package org.example.excel.model.emp;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
//個人信息更新
public class EmpInformationUpdateModel {
private String empJobNumber;
private String empName;
private String foreignName;
private String nickName;
private String gender;
private String nationality;
private String idCardType;
private String idCardNumber;
}
(左右滑動查看完整代碼)
Model層和Excel的列是一一對應的獲取網站完整源碼工具,以下面的注解為例子:
@ExcelProperty(value = "*F00730-工號", index = 0)
(左右滑動查看完整代碼)
第一行是標題頭,第一行第一列的位置由0來表示,0,1,2,3,4…依次遞增,第一行第一列的標題名稱是*-工號。
層
package org.example.excel.change;
import com.github.javafaker.Faker;
import org.example.excel.ExceptionTransferImport;
import org.example.excel.constant.ChangeConstant;
import org.example.excel.model.Employee;
import org.example.excel.model.emp.EmpInformationUpdateModel;
import org.example.excel.util.IdCardGenerator;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.logging.Logger;
import static org.example.excel.util.RandomDateUtil.randomDate;
//個人信息更新
public class EmpInformationUpdate {
//日志記錄
static java.util.logging.Logger logger = Logger.getLogger("com.hongtao.flywheel");
//調用Model層的函數
public static List
empInformationUpdateData(List empList) {
//構建一個List來存放數據
List
list = new ArrayList ();
//使用java-faker框架,來生成隨機姓名,身份證
Faker FAKER = new Faker(Locale.CHINA);
Faker FAKEREN = new Faker(Locale.ENGLISH);
IdCardGenerator idCardGenerator = new IdCardGenerator();
//構建for循環,控制生成測試數據的條數
for (int i = 0; i < ExceptionTransferImport.CYCLESNUMBER; i++) {
//調用了Model層,表示生成的單條數據的類型,和Model類一致
EmpInformationUpdateModel data = new EmpInformationUpdateModel();
data.setEmpName(empList.get(i).getEmpName());
data.setEmpJobNumber(empList.get(i).getEmpJobNumber());
//使用java-faker框架,來生成隨機姓名,身份證
data.setForeignName(FAKEREN.name().lastName() + new Random().nextInt(50));
data.setNickName(FAKEREN.name().lastName() + new Random().nextInt(50));
//下面都是調用數據字典類數據
data.setIdCardType(new ChangeConstant().getValue(ChangeConstant.idCardType));
data.setNationality(new ChangeConstant().getValue(ChangeConstant.nationality));
data.setNation(new ChangeConstant().getValue(ChangeConstant.nation));
//List鏈表增加一條數據
list.add(data);
}
//返回鏈表
return list;
}
}
(左右滑動查看完整代碼)
數據字典類解析:配置數據字典,因為在有些數據是固定值,需要隨機選擇數據,所以用list來存儲這些數據字典。
(new ChangeConstant().getValue(ChangeConstant.contractType);
(左右滑動查看完整代碼)
這句話是為了隨機獲取一個存在List內的數據字典。
數據字典也是用list存放,通過方法隨機取一個值,如下:
public static final List idCardType = Arrays.asList("中國護照", "臺灣居民來往大陸通行證", "外國護照", "居民身份證", "港澳居民來往內地通行證");
public static final List gender = Arrays.asList("男", "女");
public String getValue(List list) {
Random random = new Random();
int n = random.nextInt(list.size());
return list.get(n).toString();
}
(左右滑動查看完整代碼)
生成隨機時間的類
("2020-01-01", "2022-01-01")是隨機生成在開始時間和結束時間范圍內的一個日期值,函數如下:
public static String randomDate(String beginDate,String endDate){
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date start = format.parse(beginDate);
Date end = format.parse(endDate);
if(start.getTime() >= end.getTime()){
return null;
}
long date = random(start.getTime(),end.getTime());
String dateString=
asLocalDate(longToDate(date)).format(DateTimeFormatter.ofPattern("yyyy-MM" +
"-dd"));
return dateString;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
(左右滑動查看完整代碼)
java-faker的用法
可以生成隨機的姓名、街道、公司、天氣、超級英雄、星球大戰等等等等。
data.setForeignName(FAKEREN.name().lastName());
data.setLuckyName(FAKER.funnyName().name());
(左右滑動查看完整代碼)
結合起來
調用Easy Excel框架,生成Excel的方法,Main函數生成數據:
String updateContractChangeFileName =
TestFileUtil.getPath() + "個人信息更新"+".xlsx";
EasyExcel.write(updateContractChangeFileName,
UpdateContractChangeModel.class).sheet("模板").doWrite(UpdateContractChange.updateContractChangeData(empInfomationList));
(左右滑動查看完整代碼)
結果展示
總結
在工作當中,我們經常遇到批量生成測試數據的需求,所以這個時候,我們可以借鑒網上成熟的生成隨機數據方法,Java-Faker框架,很方便的構造測試數據。
再結合業務上的需求,引入了阿里巴巴的Easy Excel框架,站在前人的肩膀上,助力測試業務更好的開展。這樣子測試的工作才會越走越順,測試的效率也能夠不斷的提高~
End
-往期回顧-////