Skip to content

Commit 458c0a6

Browse files
committed
feat(test): 新增Mock数据生成测试工具
- 添加MockData实体类用于测试数据生成 - 实现MockDataTest类生成百万级测试数据 - 支持随机生成中文姓名/邮箱/地址等字段 - 提供Excel导出功能验证大数据量处理能力
1 parent d9c1949 commit 458c0a6

2 files changed

Lines changed: 210 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.pig4cloud.plugin.excel.mock;
2+
3+
import cn.idev.excel.annotation.ExcelProperty;
4+
import lombok.Data;
5+
6+
/**
7+
* Mock数据实体类
8+
*
9+
* @author lengleng
10+
* @date 2025/12/08
11+
*/
12+
@Data
13+
public class MockData {
14+
15+
/**
16+
* 用户ID
17+
*/
18+
@ExcelProperty(value = "用户ID", index = 0)
19+
private Long userId;
20+
21+
/**
22+
* 用户名
23+
*/
24+
@ExcelProperty(value = "用户名", index = 1)
25+
private String username;
26+
27+
/**
28+
* 邮箱
29+
*/
30+
@ExcelProperty(value = "邮箱", index = 2)
31+
private String email;
32+
33+
/**
34+
* 年龄
35+
*/
36+
@ExcelProperty(value = "年龄", index = 3)
37+
private Integer age;
38+
39+
/**
40+
* 电话号码
41+
*/
42+
@ExcelProperty(value = "电话号码", index = 4)
43+
private String phone;
44+
45+
/**
46+
* 地址
47+
*/
48+
@ExcelProperty(value = "地址", index = 5)
49+
private String address;
50+
51+
/**
52+
* 部门
53+
*/
54+
@ExcelProperty(value = "部门", index = 6)
55+
private String department;
56+
57+
/**
58+
* 薪资
59+
*/
60+
@ExcelProperty(value = "薪资", index = 7)
61+
private Double salary;
62+
63+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package com.pig4cloud.plugin.excel.mock;
2+
3+
import cn.idev.excel.EasyExcel;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.io.File;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Random;
10+
11+
/**
12+
* Mock数据生成测试类 - 生成10万条数据
13+
*
14+
* @author lengleng
15+
* @date 2025/12/08
16+
*/
17+
class MockDataTest {
18+
19+
private static final int TOTAL_COUNT = 1000000;
20+
21+
private static final String[] FIRST_NAMES = { "张", "李", "王", "刘", "陈", "杨", "赵", "黄", "周", "吴", "徐", "孙",
22+
"胡", "朱", "高", "林", "何", "郭", "马", "罗" };
23+
24+
private static final String[] LAST_NAMES = { "伟", "芳", "娜", "秀英", "敏", "静", "丽", "强", "磊", "军", "洋", "勇",
25+
"艳", "杰", "涛", "明", "超", "秀兰", "霞", "平", "刚", "桂英" };
26+
27+
private static final String[] DEPARTMENTS = { "技术部", "产品部", "运营部", "市场部", "人力资源部", "财务部", "销售部", "客服部",
28+
"设计部", "行政部" };
29+
30+
private static final String[] CITIES = { "北京", "上海", "广州", "深圳", "杭州", "南京", "成都", "武汉", "西安", "重庆" };
31+
32+
private static final String[] DISTRICTS = { "朝阳区", "海淀区", "浦东新区", "天河区", "南山区", "西湖区", "江宁区", "武侯区",
33+
"雁塔区", "渝北区" };
34+
35+
private final Random random = new Random();
36+
37+
// @Test
38+
void generateMockData() {
39+
String fileName = System.getProperty("user.home") + File.separator + "mock_data_1000000.xlsx";
40+
41+
long startTime = System.currentTimeMillis();
42+
System.out.println("开始生成 " + TOTAL_COUNT + " 条Mock数据...");
43+
44+
// 生成数据
45+
List<MockData> dataList = new ArrayList<>(TOTAL_COUNT);
46+
for (int i = 1; i <= TOTAL_COUNT; i++) {
47+
MockData data = new MockData();
48+
data.setUserId((long) i);
49+
data.setUsername(generateRandomName());
50+
data.setEmail(generateRandomEmail(i));
51+
data.setAge(generateRandomAge());
52+
data.setPhone(generateRandomPhone());
53+
data.setAddress(generateRandomAddress());
54+
data.setDepartment(generateRandomDepartment());
55+
data.setSalary(generateRandomSalary());
56+
dataList.add(data);
57+
58+
// 每1万条打印一次进度
59+
if (i % 10000 == 0) {
60+
System.out.println("已生成 " + i + " 条数据...");
61+
}
62+
}
63+
64+
long generateTime = System.currentTimeMillis();
65+
System.out.println("数据生成完成,耗时: " + (generateTime - startTime) + "ms");
66+
67+
// 写入Excel
68+
System.out.println("开始写入Excel文件: " + fileName);
69+
EasyExcel.write(fileName, MockData.class).sheet("用户数据").doWrite(dataList);
70+
71+
long writeTime = System.currentTimeMillis();
72+
System.out.println("Excel写入完成,耗时: " + (writeTime - generateTime) + "ms");
73+
System.out.println("总耗时: " + (writeTime - startTime) + "ms");
74+
System.out.println("文件保存路径: " + fileName);
75+
}
76+
77+
/**
78+
* 生成随机姓名
79+
*/
80+
private String generateRandomName() {
81+
String firstName = FIRST_NAMES[random.nextInt(FIRST_NAMES.length)];
82+
String lastName = LAST_NAMES[random.nextInt(LAST_NAMES.length)];
83+
// 有30%的概率生成三个字的名字
84+
if (random.nextInt(100) < 30) {
85+
String lastName2 = LAST_NAMES[random.nextInt(LAST_NAMES.length)];
86+
return firstName + lastName + lastName2;
87+
}
88+
return firstName + lastName;
89+
}
90+
91+
/**
92+
* 生成随机邮箱
93+
*/
94+
private String generateRandomEmail(int id) {
95+
String[] domains = { "gmail.com", "qq.com", "163.com", "126.com", "sina.com", "outlook.com" };
96+
return "user" + id + "@" + domains[random.nextInt(domains.length)];
97+
}
98+
99+
/**
100+
* 生成随机年龄 (22-60岁)
101+
*/
102+
private Integer generateRandomAge() {
103+
return 22 + random.nextInt(39);
104+
}
105+
106+
/**
107+
* 生成随机手机号
108+
*/
109+
private String generateRandomPhone() {
110+
String[] prefixes = { "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "150", "151",
111+
"152", "153", "155", "156", "157", "158", "159", "180", "181", "182", "183", "185", "186", "187",
112+
"188", "189" };
113+
String prefix = prefixes[random.nextInt(prefixes.length)];
114+
StringBuilder phone = new StringBuilder(prefix);
115+
for (int i = 0; i < 8; i++) {
116+
phone.append(random.nextInt(10));
117+
}
118+
return phone.toString();
119+
}
120+
121+
/**
122+
* 生成随机地址
123+
*/
124+
private String generateRandomAddress() {
125+
String city = CITIES[random.nextInt(CITIES.length)];
126+
String district = DISTRICTS[random.nextInt(DISTRICTS.length)];
127+
int streetNum = 1 + random.nextInt(999);
128+
int buildingNum = 1 + random.nextInt(50);
129+
int roomNum = 100 + random.nextInt(900);
130+
return city + district + "街道" + streetNum + "号" + buildingNum + "栋" + roomNum + "室";
131+
}
132+
133+
/**
134+
* 生成随机部门
135+
*/
136+
private String generateRandomDepartment() {
137+
return DEPARTMENTS[random.nextInt(DEPARTMENTS.length)];
138+
}
139+
140+
/**
141+
* 生成随机薪资 (5000-50000)
142+
*/
143+
private Double generateRandomSalary() {
144+
return 5000.0 + random.nextInt(45000);
145+
}
146+
147+
}

0 commit comments

Comments
 (0)