大数跨境
0
0

手动造数据OUT了!用DataFaker生成百万级真实感演示数据

手动造数据OUT了!用DataFaker生成百万级真实感演示数据 Spring全家桶实战案例
2025-11-29
0
导读:手动造数据OUT了!用DataFaker生成百万级真实感演示数据
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《Spring Boot实战案例合集》目前已更新194个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:SpringBoot3.4.2



1. 简介

在软件开发与测试过程中,生成高质量测试数据是保障系统稳定性和业务正确性的核心需求。传统方式依赖手动编写固定测试用例或简单随机字符串,但存在显著痛点:数据缺乏真实业务语义(如无效地址、格式错误的ID),难以覆盖复杂场景(如多语言、地区化规则);同时,维护成本高昂,尤其是跨团队协作时,测试数据易因业务变更失效。

本篇文章我们将介绍一款开源的组件DataFaker。DataFaker(https://www.datafaker.net/)是JavaFaker库的现代演进版本,专为JVM生态系统(Java、Kotlin、Scala)从零设计。它提供了丰富可扩展API。

2.实战案例
环境准备
我们只需要引入如下依赖即可:
<dependency>  <groupId>net.datafaker</groupId>  <artifactId>datafaker</artifactId>  <version>2.5.2</version></dependency>
2.1 基本使用
如下我们列出来是比较常用的测试数据生成
Faker faker = new Faker();
// 生成个人姓名信息String fullName   = faker.name().fullName();System.err.printf("fullName: %s%n", fullName);String firstName  = faker.name().firstName();System.err.printf("firstName: %s%n", firstName);String username   = faker.credentials().username();System.err.printf("username: %s%n", username);String password   = faker.credentials().password();System.err.printf("password: %s%n", password);String email      = faker.internet().emailAddress();System.err.printf("email: %s%n", email);
String ipv4       = faker.internet().ipV4Address();System.err.printf("ipv4: %s%n", ipv4);String macAddress = faker.internet().macAddress();System.err.printf("macAddress: %s%n", macAddress);
String phoneNumber = faker.phoneNumber().phoneNumber();System.err.printf("phoneNumber: %s%n", phoneNumber);
// 生成地址信息String streetAddress = faker.address().streetAddress();System.err.printf("streetAddress: %s%n", streetAddress);String city        = faker.address().city();System.err.printf("city: %s%n", city);String zipCode     = faker.address().zipCode();System.err.printf("zipCode: %s%n", zipCode);String country     = faker.address().country();System.err.printf("country: %s%n", country);
String companyName = faker.company().name();System.err.printf("companyName: %s%n", companyName);String jobTitle   = faker.job().title();System.err.printf("jobTitle: %s%n", jobTitle);
运行结果
我们当前使用的Faker版本提供了如下几种分类数据生成:
  • 基础类(日常数据提供程序)

  • 娱乐类(电影、节目、书籍相关数据提供程序)

  • 食品类(各类食品相关数据提供程序)

  • 体育类(各类体育相关数据提供程序)

  • 电子游戏类(电子游戏相关数据提供程序)

共计:256种类型的数据。
2.2 国际化支持

要使用 Datafaker 处理不同区域设置,您可以在构造函数中提供区域设置参数,如下示例:

Faker faker = new Faker(Locale.CHINA) ;String fullName= faker.name().fullName();System.err.printf("fullName: %s%n", fullName) ;String firstName= faker.name().firstName();System.err.printf("firstName: %s%n", firstName) ;String username= faker.credentials().username() ;System.err.printf("username: %s%n", username) ;

在构造函数中指定Locale,运行结果:

fullName: 巫伟祺firstName: 熠彤username: 博文.戚

2.3 随机枚举值

要从 Java 枚举中获取随机值,可以使用 Options.option() 方法。以下示例假设你需要从 Day 枚举中获取随机值。

public enum Day {  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
Faker faker = new Faker() ;Options opt= faker.options();Day day1 = opt.option(Day.class) ;Day day2 = opt.option(Day.class) ;System.err.printf("day1: %s, day2: %s%n", day1, day2);

运行结果

day1: FRIDAY, day2: SATURDAY

2.4 生成集合数据

如下示例,将生成一个包含名字和姓氏的List集合,其中元素数量介于3到5之间:

Faker faker = new Faker(Locale.CHINA);List<String> names = faker.collection(      () -> faker.name().firstName(),       () -> faker.name().lastName())    .len(35)    .generate();System.err.println(names);

运行结果

[姬, 烨伟, 立轩, 狄]

生成不同类型数据

List<Object> objects =faker.<Object>collection(      () -> faker.name().firstName(),      () -> faker.random().nextInt(100))    .maxLen(5)    .generate() ;System.err.println(objects) ;

运行结果

[89, 36, 56, 鸿煊, 伟泽]

生成带有null的值

List<Object> objects = faker.<Object>collection(      () -> faker.name().firstName(),      () -> faker.random().nextInt(100))    .nullRate(0.3)    .maxLen(5)    .generate() ;
通过nullRate设定生成约30%的null数据,运行结果
[nullnull73, 姣姣, 修杰]
2.5 Schema 与 Transformers

Schema是一组规则,用于描述如何将数据从Datafaker的表示形式转换为其支持的某种格式。Schema主要优势之一在于,同一Schema可用于转换为不同的格式。Schema有两种使用方式:既可用于从头生成数据,也可用于转换现有数据。如下示例定义Schema:

Faker faker = new Faker(Locale.CHINA) ;Schema<StringString> schema = Schema.of(    field("first_name", () -> faker.name().firstName()),    field("last_name", () -> faker.name().lastName()),    field("address", () -> faker.address().streetAddress()));    
接下来,我们就可以通过Transformer进行转换输出上面定义的Schema,如下示例:
// 以Csv格式输出CsvTransformer<String> transformer = CsvTransformer.<String>builder()     .header(true)     .separator(",")     .quote('\0')     .build() ;// 生成10条数据String csv = transformer.generate(schema, 10) ;
运行结果
生成SQL语句
Schema<StringObject> schema = Schema.of(field("name", () -> faker.name().firstName()),        field("age", () -> faker.number().numberBetween(1100)),        field("age", () -> faker.number().numberBetween(1100)),        field("phone", () -> faker.phoneNumber().phoneNumber()));SqlTransformer<String> sqlTran =    newSqlTransformer.SqlTransformerBuilder<String>()        .batch(5)        .tableName("t_user")        .dialect(SqlDialect.MYSQL)        .build();String sql = sqlTran.generate(schema, 10);System.err.println(sql) ;
运行结果
INSERT INTO t_user (name, age, age, phone)VALUES ('豪'3594'0871 9524 6228'),       ('语堂'888'0433 10056'),       ('烨华'2881'0769 1066 1100'),       ('擎苍'1332'0737 005 3997'),       ('凯瑞'8540'010 1645 6841');INSERT INTO t_user (name, age, age, phone)VALUES ('鸿煊'783'080 78123'),       ('烨霖'7319'0413 10028'),       ('苑博'2666'024 6983 4965'),       ('睿渊'547'0435 10029'),       ('哲瀚'1183'010 12345');
除了上面介绍的2种转换器外,还支持的转换:JSON, YAML, XML, Java Object, TOML。
2.6 表达式支持
DataFaker还支持各种表达式的应用,如下示例:
Faker faker = new Faker();faker.expression("#{letterify 'test????test'}"); // testqwastestfaker.expression("#{numerify '#test#'}"); // 3test5faker.expression("#{templatify 'test','t','q','@'}"); //@esqfaker.expression("#{examplify 'test'}"); // ghjkfaker.expression("#{regexify '[a-z]{4,10}'}"); // wbevoafaker.expression("#{options.option '23','2','5','$','%','*'}"); // *faker.expression("#{date.birthday 'yy DDD hh:mm:ss'}"); //61327 08:11:45faker.expression("#{csv '1','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}");//"name_column","last_name_column"// "Sabrina","Kihn"faker.expression("#{json 'person','#{json ''first_name'',''#{Name.first_name}'',''last_name'',''#{Name.last_name}''}','address','#{json ''country'',''#{Address.country}'',''city'',''#{Address.city}''}'}");// {"person": {"first_name""Barbie""last_name""Durgan"}, "address": {"country""Albania""city""East Catarinahaven"}}


以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
强大!Spring非常实用的内置类专门处理Rest API异常

强大!Spring Boot 9个宝藏注解,提升你的代码水平

告别手写SQL!Spring AI 智能生成+执行,效率提升1000%

高级开发!一个注解简化Spring Boot本地消息表(Outbox)实现

自定义@Proxy注解!Spring Boot 动态控制代理功能,真的很强大

JSON处理不再头疼!Jackson Tree模型解锁JSON操作的开挂模式

优化!高并发下 Spring Boot 乐观锁 + 悲观锁性能调优

惊呆了!Controller接口返回值支持17种逆天类型

JdbcTemplate已过时?Spring6.1新特性JdbcClient流畅链式API

在 Spring Boot 中加载属性文件的7种方法

必备开发技能!基于Spring Boot各种场景下的数据类型转换技巧

图片
图片
图片
图片
图片
图片
图片
图片
图片

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832