0.背景
最近在开发一个web小demo,其中进行数据测试需要对一些字段特别多的java bean进行初始化,一番百度之后查找到了几个解决方案,记录如下。
1.Jpopulator
1.1 pom依赖
<dependency>
<groupId>io.github.benas</groupId>
<artifactId>jpopulator</artifactId>
<version>1.0.1</version>
</dependency>
1.2 使用方式及测试
- 实体类
import lombok.Data;
@Data
public class Person {
private int id;
private String name;
private String gender;
}
- 测试代码
@Test
public void testJpopulator(){
Populator populator = new PopulatorBuilder().build();
Person person = (Person) populator.populateBean(Person.class);
System.out.println(person);
List<Person> persons = populator.populateBeans(Person.class, 2);
System.out.println(persons);
}
Person(id=-1042426959, name=nOBdJpkFbB, gender=bCwLDjOxXb)
[Person(id=813095571, name=zxDkvjecWM, gender=SztfWBTZEj), Person(id=1664076867, name=ckMadNdfcX, gender=qmxsXZOiOI)]
2.PODAM
2.1 pom依赖
<dependency>
<groupId>uk.co.jemos.podam</groupId>
<artifactId>podam</artifactId>
<version>7.1.1.RELEASE</version>
</dependency>
2.2 使用方式及测试
- 实体类
import lombok.Data;
@Data
public class Person {
private int id;
private String name;
private String gender;
}
- 基本使用
@Test
public void testPodam(){
PodamFactory factory = new PodamFactoryImpl();
Person person = factory.manufacturePojo(Person.class);
System.out.println(person);
}
Person(id=1889825458, name=s6tv8LgsPD, gender=zY5put8aZT)
2.3 进阶自定义数据生成策略
比较复杂,不推荐。
参考文档:Java Unit Tests make easy - Random Values with PODAM (onloadcode.com)
3.common-random
参考文档:https://github.com/yindz/common-random
支持的数据类型:
- 数字(int/long/double)
- 汉字(简体)
- 邮箱地址
- 中文人名(简体)
- 英文人名
- 虚拟身份证号码(中国大陆)
- 虚拟信用卡号码(Visa/Mastercard/JCB/银联/AmericanExpress)
- 手机号码(中国大陆)
- 省份和城市(中国大陆)
- 邮编(中国大陆)
- 联系地址(中国大陆)
- 车牌号(中国大陆,包括新能源车型)
- 域名
- 静态URL
- 日期(特定日期之前/特定日期之后)
- 时间(过去/未来)
- 时间戳
- 强密码
- 网络昵称(登录名)
- 拼音网络昵称(登录名)
- IPv4地址
- 端口号
- QQ号码
- 非主流QQ网名
- 学历
- 小学名称、年级、班级
- 中学名称、年级、班级
- 高校名称(数据取自教育部网站)
- 公司名称
- 经纬度(中国)
- 中文短句
- User-Agent(PC/Android/iOS)
- 网卡MAC地址
- RGB颜色值
- HEX颜色值
- 股票名称+股票代码
- 开放式基金名称+基金代码
缺点:
- 只能逐一生成单个的随机字段,数据、生成对象需要逐一对对象的属性进行填充吗。
- 对于字段较多的对象生成比较麻烦
4.Jmockdata(★★★)(推荐)
支持类型:
- Java基本类型
- 字符串
- 枚举
- 日期
- 数组
- 多维数组
- 集合[List|Set|Map]
- Java对象
4.1 pom依赖
<dependency>
<groupId>com.github.jsonzou</groupId>
<artifactId>jmockdata</artifactId>
<version>4.2.0</version>
</dependency>
4.2 Java常用类型的生成
@Test
public void testJmockdata(){
int randomInt = JMockData.mock(int.class);
long randomLong = JMockData.mock(long.class);
double randomDouble = JMockData.mock(double.class);
float randomFloat = JMockData.mock(float.class);
String randomString = JMockData.mock(String.class);
BigDecimal randomBigDecimal = JMockData.mock(BigDecimal.class);
System.out.println("randomInt:"+randomInt);
System.out.println("randomLong:"+randomLong);
System.out.println("randomDouble:"+randomDouble);
System.out.println("randomFloat:"+randomFloat);
System.out.println("randomString:"+randomString);
System.out.println("randomBigDecimal:"+randomBigDecimal);
}
randomInt:1116
randomLong:6722
randomDouble:1303.83
randomFloat:9700.79
randomString:cggMvc
randomBigDecimal:3029.8
4.3 对象的生成
- 实体类
@Data
public class Student {
private int id;
private String name;
private int age;
private LocalDateTime createTime;
}
- 生成测试数据
@Test
public void testJmockdata(){
Student student1 = JMockData.mock(Student.class);
System.out.println("默认生成策略生成结果:"+student1);
//按照规则定义Student对象里面单个字段生成,没配置的就按默认的生成邪恶了
MockConfig mockConfig = new MockConfig()
.subConfig("id").intRange(1,10)
.subConfig("name").subConfig("[a-zA-Z_]{1}[a-z0-9_]{5,15}")
.subConfig("age").intRange(18,21)
.globalConfig();
Student student2 = JMockData.mock(Student.class,mockConfig);
System.out.println("自定义生成策略生成结果:"+student2);
}
- 执行结果
默认生成策略生成结果:Student(id=7105, name=s, age=9755, createTime=2039-09-15T13:53:47.294)
自定义生成策略生成结果:Student(id=1, name=akXrp, age=18, createTime=2050-12-04T07:05:53.299)
4.4 根据正则模拟数据
配合4.3共同完成对象属性的初始化。
/**
* 根据正则模拟数据
* 正则优先于其他规则
*/
@Test
public void testRegexMock() {
MockConfig mockConfig = new MockConfig()
// 随机段落字符串
.stringRegex("I'am a nice man\\.And I'll just scribble the characters, like:[a-z]{2}-[0-9]{2}-[abc123]{2}-\\w{2}-\\d{2}@\\s{1}-\\S{1}\\.?-.")
// 邮箱
.subConfig(RegexTestDataBean.class,"userEmail")
.stringRegex("[a-z0-9]{5,15}\\@\\w{3,5}\\.[a-z]{2,3}")
// 用户名规则
.subConfig(RegexTestDataBean.class,"userName")
.stringRegex("[a-zA-Z_]{1}[a-z0-9_]{5,15}")
// 年龄
.subConfig(RegexTestDataBean.class,"userAge")
.numberRegex("[1-9]{1}\\d?")
// 用户现金
.subConfig(RegexTestDataBean.class,"userMoney")
.numberRegex("[1-9]{2}\\.\\d?")
// 用户的得分
.subConfig(RegexTestDataBean.class,"userScore")
.numberRegex("[1-9]{1}\\d{1}")
// 用户身价
.subConfig(RegexTestDataBean.class,"userValue")
.numberRegex("[1-9]{1}\\d{3,8}")
.globalConfig();
}
参考资料
- Jpopulator测试数据生成工具-腾讯云开发者社区-腾讯云 (tencent.com)
- Podam 一个Pojo填充随机值利器_这个程序员像只猴的博客-CSDN博客
- jmockdata: Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。单元测试的利器 (gitee.com)
- GitHub - yindz/common-random: 简单易用的随机数据生成器。生成各种比较真实的假数据。一般用于开发和测试阶段的数据填充模拟。支持各类中国特色本地化的数据格式。An easy-to use random data generator. Generally used for data filling, simulation, demonstration and other scenarios in the development and test phase.
- JmockData---jfairy 学习记录(生成测试数据)_"小王"的博客-CSDN博客
- Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架-面圈网 (mianshigee.com)
评论 (0)