javafaker测试数据生成实战

news2024/12/25 4:11:38

javafaker测试数据生成实战

  • 1.背景
  • 2.介绍
    • 2.1 特点
  • 3. 使用
    • 3.1 基础使用
      • 3.1.1 maven依赖
      • 3.1.1 使用示例
    • 3.2 进阶使用
      • 3.1 生成中文信息
      • 3.2 根据姓名生成账号
        • 3.2.1 maven依赖
        • 3.2.2 中文转拼音工具类
    • 3.3 高级使用
      • 3.3.1 中文性名重复处理
        • 方案1: 偷懒方式
        • 方案2: 较真模式

1.背景

最近需要测试mysql的json字段的相关性能如查询性能,需要大量数据场景下验证,比如100万条信息。本来要自己造,但是不够真实写起来挺麻烦。笔者是懒人,研究下了JavaFaker 可以正好满足场景,本文总结下使用用法,及碰到一些不满足要求场景的解决方案

需要造数据如下:

字段名说明
name姓名
username用户名
address地址
email电子邮件地址
phoneNumber手机号码
date生日日期
scope范围
password密码
ipAddressIPv4地址
bloodGroup血型

2.介绍

JavaFaker 是一个用于生成假数据(例如姓名、地址、电子邮件、日期等)的Java库。它可以帮助开发人员在开发和测试过程中生成真实和随机的数据,而不必依赖于真实的数据集。以下是 JavaFaker 的主要特点和用法:

2.1 特点

  • 多语言支持: JavaFaker 支持多种语言,包括英语、中文、法语、德语等。

  • 丰富的数据类型: JavaFaker 可以生成各种类型的假数据,包括姓名、地址、电子邮件、日期、电话号码、公司名称、文本段落等。

  • 随机性和真实性: 生成的数据是随机的,但是符合真实世界的模式和格式,使得生成的数据看起来更真实。

  • 可自定义: 可以通过扩展和自定义来满足特定需求,例如自定义国家、姓氏、名字等。

3. 使用

3.1 基础使用

3.1.1 maven依赖

        <!--随机生成测试数据-->
        <dependency>
            <groupId>com.github.javafaker</groupId>
            <artifactId>javafaker</artifactId>
            <version>1.0.2</version>
        </dependency>

3.1.1 使用示例

import com.github.javafaker.Faker;

public class JavaFakerBaseTest {
    public static void main(String[] args) {
        Faker faker = new Faker(); // 默认语言为英语

        // 生成随机姓名、地址、电子邮件等
        String name = faker.name().fullName();
        String address = faker.address().fullAddress();
        String email = faker.internet().emailAddress();
        String phoneNumber = faker.phoneNumber().cellPhone();
        String date = faker.date().birthday().toString();

        // 输出生成的数据
        System.out.println("姓名: " + name);
        System.out.println("地址: " + address);
        System.out.println("邮箱: " + email);
        System.out.println("电话号码: " + phoneNumber);
        System.out.println("生日: " + date);
    }
}

效果:
在这里插入图片描述

3.2 进阶使用

3.1 生成中文信息

Faker faker = new Faker(new Locale(“zh”, “CN”)); // 设置语言为简体中文

public class JavaFakerTest {
    public static void main(String[] args) {
        Faker faker = new Faker(new Locale("zh", "CN")); // 设置语言为简体中文

        for (int i = 0; i < 100; i++) { // 生成10个随机中文名字
            String name = faker.name().fullName(); // 随机生成姓名
            String address = faker.address().fullAddress(); // 随机生成地址
//            String email = faker.internet().emailAddress(); // 随机生成电子邮件地址
            //String username = PinyinUtils.convertToPinyin(name);
            String email = faker.internet().emailAddress(username);
            String phoneNumber = faker.phoneNumber().cellPhone(); // 随机生成手机号码
            Date date = faker.date().birthday(); // 随机生成生日日期
            int scope = faker.number().numberBetween(1, 100); // 在指定范围内生成随机整数

            String password = faker.internet().password(8, 9, true); // 随机生成密码
            String ipAddress = faker.internet().ipV4Address(); // 随机生成IPv4地址
            String bloodGroup = faker.name().bloodGroup(); //随机生成血型

            // 打印生成的随机数据,使用制表符分隔
            System.out.println(name + "\t" + username + "\t" + address + "\t" + email + "\t" + phoneNumber + "\t" + date + "\t" + scope + "\t" + password + "\t" + ipAddress + "\t" + bloodGroup);


        }
    }



}

3.2 根据姓名生成账号

根据用户名生成拼音作为用户的用户名。 需要借助pinyin4j 来实现

3.2.1 maven依赖
        <!--汉字转拼音-->
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>

3.2.2 中文转拼音工具类


/**
 * 依赖如下
 *         <dependency>
 *             <groupId>com.belerweb</groupId>
 *             <artifactId>pinyin4j</artifactId>
 *             <version>2.5.1</version>
 *         </dependency>
 */
public class PinyinUtils {

    private static final HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();

    static {
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
    }

    /**
     * 将中文字符串转换为拼音
     *
     * @param chinese 中文字符串
     * @return 拼音字符串,如果无法转换返回空字符串
     */
    public static String convertToPinyin(String chinese) {
        StringBuilder pinyinBuilder = new StringBuilder();

        for (char ch : chinese.toCharArray()) {
            // 判断是否为汉字字符
            if (Character.toString(ch).matches("[\\u4E00-\\u9FA5]+")) {
                try {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(ch, format);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        // 多音字只取第一个拼音
                        pinyinBuilder.append(pinyinArray[0]);
                    }
                } catch (Exception e) {
                    // 异常时保持原样
                    pinyinBuilder.append(ch);
                }
            } else {
                // 非汉字字符保持原样
                pinyinBuilder.append(ch);
            }
        }

        return pinyinBuilder.toString();
    }



    public static void main(String[] args) {
        String chineseName = "张三"; // 中文名字
        String pinyin = PinyinUtils.convertToPinyin(chineseName);
        System.out.println("拼音: " + pinyin);
    }
}

  • 效果

在这里插入图片描述

3.3 高级使用

3.3.1 中文性名重复处理

在实际使用测试数据导入,数据库中,当循环生成测试数据,当数据量较大时候(一万多条时候). 会出现性名重复情况。虽然姓名重复,在现实存在, name可以重复,但是username用来用户登录唯一标识,肯定需要唯一性。

方案1: 偷懒方式

重复username使用累计编号,使用先来后到重名就加一。如: zhangsan -> zhangsan1

  1. 先获取所有用户名
  2. 判断如果重复则在根据name生成的username加序号
@Service
public class AccountServiceImpl implements AccountService {
    private static final Logger LOGGER = LoggerFactory.getLogger(AccountServiceImpl.class);

    @Autowired
    private AccountMapper accountMapper;

    private Faker faker = new Faker(new Locale("zh", "CN")); // 设置语言为简体中文

    public void batchInitAccount(int count) {
        List<Object> allUsername = listAllUsername();
        Faker faker = new Faker(new Locale("zh", "CN")); // 设置语言为简体中文

        for (int i = 0; i < count; i++) {

            String name = faker.name().fullName(); // 随机生成姓名
            String username = PinyinUtils.convertToPinyin(name);
            // 名字重复继续生成
            int num = 1;
            while (allUsername.contains(username)) {

                username = PinyinUtils.convertToPinyin(name) + num ++;

            }
            allUsername.add(username);
            String address = faker.address().fullAddress(); // 随机生成地址
//            String email = faker.internet().emailAddress(); // 随机生成电子邮件地址
            String email = faker.internet().emailAddress(username);
            String phoneNumber = faker.phoneNumber().cellPhone(); // 随机生成手机号码
            Date date = faker.date().birthday(); // 随机生成生日日期
            int scope = faker.number().numberBetween(1, 100); // 在指定范围内生成随机整数
            String password = faker.internet().password(8, 9, true); // 随机生成密码
            String ipAddress = faker.internet().ipV4Address(); // 随机生成IPv4地址
            String bloodGroup = faker.name().bloodGroup(); //随机生成血型

            Account account = new Account();
            account.setUsername(username);
            account.setPassword(password);
            account.setName(name);
            account.setPhone(phoneNumber);
            account.setEmail(email);
            account.setCreateTime(date);
            JSONObject extendJson = new JSONObject();
            extendJson.put("address", address);
            extendJson.put("scope", scope);
            extendJson.put("ip", ipAddress);
            extendJson.put("bloodGroup", bloodGroup);
            account.setExtendJson(extendJson);
            try {

                this.accountMapper.insert(account);
                System.out.println(account.getId());
            } catch (Exception e) {
//                e.printStackTrace();
                // 名字重复忽略
                LOGGER.error("名字重复");
            }

        }
    }
}
方案2: 较真模式

TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 被爆重大隐私泄露!在回答时突然蹦出陌生男子自拍照,你的数据都将被偷走训练模型!

ChatGPT 被爆重大隐私泄露 &#xff01; 一位用户在向 ChatGPT 询问 Python 中的代码格式化包 black 的用法时&#xff0c;没有一点点防备&#xff0c;ChatGPT 在回答中插入了一个陌生男子的自拍照&#xff08;手动捂脸.jpg&#xff09; 可以看到刚开始 ChatGPT 还相当正常&am…

智慧灯杆网关智能化选择(网关助力城市完整项目方案)

在当代城市发展中&#xff0c;智慧照明作为一项重要的技术创新&#xff0c;正逐渐改变着我们的城市生活。作为城市智慧照明的核心设备&#xff0c;智慧灯杆网关SG600凭借出色的性能和创新的解决方案&#xff0c;成为了引领城市智慧照明的完美选择。本文将详细介绍SG600的特点和…

linux centos7安装colmap

centos安装colmap 一、安装依赖 sudo yum install \gflags-devel \glog-devel \glew-devel \atlas \atlas-devel \lapack-devel \blas-devel \flann-devel \lz4-devel \sqlite-devel \metis-devel \qt5-qtbase-devel二、编译安装colmap git clone https://github.com/colmap/…

剑指JUC原理-10.并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

服装手机壳抱枕diy来图定制小程序开发

服装手机壳抱枕diy来图定制小程序开发 一、我们的定位与特色 首先&#xff0c;我们是一个多元化商品定制商城。与其他商城不同的是&#xff0c;我们致力于提供全方位的定制服务&#xff0c;包括手机壳、抱枕、服装、水杯贴图等各类商品。 此外&#xff0c;我们还提供冲洗照片…

C语言中什么时候用“->”

使用说明 "->"是C语言中的一个运算符&#xff0c;它用于访问结构体或者联合体中的成员&#xff0c;其左边是一个指向结构体或者联合体的指针&#xff0c;右边是需要访问的成员名。 举例说明 定义结构体 # include <stdio.h> # include <stdlib.h>…

【算法练习Day37】零钱兑换 II组合总和 Ⅳ

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 零钱兑换 II组合总和 Ⅳ总结…

Redis入门04-消息通知

目录 Redis中的消息通知 命令行操作 Redis中的管道 Redis中的消息通知 Redis可以用作消息队列的中间件&#xff0c;它提供了一种轻量级、高性能的消息传递机制&#xff0c;适用于实时通信、任务队列、事件处理等各种应用。以下是有关如何使用Redis作为消息队列的一些重要信…

中国人民大学与加拿大女王大学金融硕士——人生是旷野,不是一条轨道

在这个瞬息万变的时代&#xff0c;我们每个人都像是一颗流星&#xff0c;在宇宙中独自燃烧。我们每个人都有自己的梦想&#xff0c;自己的追求&#xff0c;自己的道路。然而&#xff0c;很多时候&#xff0c;我们却发现自己被现实的轨道所束缚&#xff0c;无法自由地追求自己的…

记一次并发问题 Synchronized 失效

记一次并发问题 Synchronized 失效 场景&#xff1a;为避免信息提交重复&#xff0c;给事务方法增加了synchronized修饰符&#xff0c;实际场景中仍然无法完全避免重复&#xff0c;原因是因为在第一个线程执行完synchronized代码段后&#xff0c;此时spring还未完成事务提交&a…

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649

Langchain-Chatchat项目:4.2-P-Tuning v2使用的数据集

本文主要介绍P-tuning-v2论文中的5种任务&#xff0c;分别为Glue任务、NER任务、QA任务、SRL任务、SuperGlue任务&#xff0c;重点介绍了下每种任务使用的数据集。 一.Glue任务   GLUE&#xff08;General Language Understanding Evaluation&#xff09;是纽约大学、华盛顿…

直播界很火的无线领夹麦克风快充方案 Type-C接口 PD快充+无线麦克风可同时进行

当前市场上流行一款很火的直播神器&#xff0c;无线领夹麦克风&#xff08;MIC&#xff09;&#xff0c;应用于网红直播&#xff0c;网课教学&#xff0c;采访录音&#xff0c;视频录制&#xff0c;视频会议等等场景。 麦克风对我们来说并不陌生&#xff0c;而且品类有很多。随…

app逆向入门之车智赢

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 目录 案例分析技术依赖参数分析效果展示代码分享…

LabVIEW开发自动批次称重和卸料系统

LabVIEW开发自动批次称重和卸料系统 对自动批次称重系统具明显的优势&#xff0c;例如确保批次完整性&#xff0c;确保批次质量和一致性&#xff0c;允许更好的批次跟踪&#xff0c;并且报告生成范围更广&#xff0c;上层接口的规定更容易。称重配料系统应根据配料方法、输送机…

APP攻防--ADB基础

进入app包 先使用 adb devices查看链接状态 手机连接成功的 adb shell 获取到手机的一个shell 此时想进入app包时没有权限的&#xff0c;APP包一般在data/data/下。没有执行权限&#xff0c;如图 Permission denied 权限被拒绝 此时需要手机root&#xff0c;root后输入 su …

DbUtils + Druid 实现 JDBC 操作 --- 附BaseDao

文章目录 Apache-DBUtils实现CRUD操作1 Apache-DBUtils简介2 主要API的使用2.1 DbUtils2.2 QueryRunner类2.3 ResultSetHandler接口及实现类 3 JDBCUtil 工具类编写3.1 导包3.2 编写配置文件3.3 编写代码 4 BaseDao 编写 Apache-DBUtils实现CRUD操作 1 Apache-DBUtils简介 com…

2-爬虫-代理池搭建、代理池使用(搭建django后端测试)、爬取某视频网站、爬取某视频网站、bs4介绍和遍历文档树

1 代理池搭建 2 代理池使用 2.1 搭建django后端测试 3 爬取某视频网站 4爬取某视频网站 5 bs4介绍和遍历文档树 1 代理池搭建 # ip代理-每个设备都会有自己的IP地址-电脑有ip地址---》访问一个网站---》访问太频繁---》封ip-收费&#xff1a;靠谱稳定--提供api-免费&#xff…

NOIP2023模拟10联测31 涂鸦

题目大意 有一面由 n m n\times m nm个格子组成的墙&#xff0c;每个格子要么是黑色&#xff0c;要么是白色。你每次将会进行这样的操作&#xff1a;等概率随机选择一个位置 ( x , y ) (x,y) (x,y)和一个颜色 c c c&#xff08;黑色或白色&#xff09;&#xff0c;&#xff0…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…