优雅的生成测试数据

前言

最近项目上需要生成一些较为真实的测试数据给客户演示,所以比如用户名称里那些测试1,测试2这样的就不太好了,但是自己想,可能想个三五个还行,如果需要个几百条几千条的,可就没那么简单了,下面推荐一个工具,非常好用

common-random

简单易用的随机数据生成器。一般用于开发和测试阶段的数据填充、模拟、仿真研究、演示等场景。可以集成到各种类型的java项目中使用。

优点
  • 非常轻量级(不到1M),容易集成,无需过多第三方依赖
  • 简单方便,无需编写冗余代码
  • 生成的随机数据比较接近真实数据
使用
1
2
3
4
5
<dependency>
<groupId>com.apifan.common</groupId>
<artifactId>common-random</artifactId>
<version>1.0.19</version>
</dependency>
基础用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//地区类虚拟数据
AreaSource areaSource = RandomSource.areaSource();

//日期时间类虚拟数据
DateTimeSource dateTimeSource = RandomSource.dateTimeSource();

//教育类虚拟数据
EducationSource educationSource = RandomSource.educationSource();

//金融类虚拟数据
FinancialSource financialSource = RandomSource.financialSource();

//互联网信息类虚拟数据
InternetSource internetSource = RandomSource.internetSource();

//数字类虚拟数据
NumberSource numberSource = RandomSource.numberSource();

//个人类虚拟数据
PersonInfoSource personInfoSource = RandomSource.personInfoSource();

//体育竞技类虚拟数据
SportSource sportSource = RandomSource.sportSource();

//语言文字类虚拟数据
LanguageSource languageSource = RandomSource.languageSource();

//其它杂项虚拟数据
OtherSource otherSource = RandomSource.otherSource();
随机数字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//生成1个1~101(不含)之间的随机整数
int a = RandomSource.numberSource().randomInt(1, 101);

//生成8个1~101(不含)之间的随机整数
int[] b = RandomSource.numberSource().randomInt(1, 101, 8);

//生成1个10000000000~20000000001(不含)之间的随机长整数
long c = RandomSource.numberSource().randomLong(10000000000L, 20000000001L);

//生成9个10000000000~20000000001(不含)之间的随机长整数
long[] d = RandomSource.numberSource().randomLong(10000000000L, 20000000001L, 9);

//生成1个0.01~0.51(不含)之间的随机整数
double e = RandomSource.numberSource().randomDouble(0.01D, 0.51D);

//生成8个0.01~0.51(不含)之间的随机整数
double[] f = RandomSource.numberSource().randomDouble(0.01D, 0.51D, 8);

//生成随机百分比
BigDecimal percent = RandomSource.numberSource().randomPercent();
随机汉字
1
2
3
4
5
//生成1个随机汉字
RandomSource.languageSource().randomChinese();

//生成4个随机汉字
RandomSource.languageSource().randomChinese(4);
随机成语
1
RandomSource.languageSource().randomChineseIdiom();

随机唐诗

1
RandomSource.languageSource().randomTangPoem();

随机人名

中文名
1
2
3
4
5
6
7
8
//生成1个随机中文人名(性别随机)
RandomSource.personInfoSource().randomChineseName();

//生成1个随机男性中文人名
RandomSource.personInfoSource().randomMaleChineseName();

//生成1个随机女性中文人名
RandomSource.personInfoSource().randomFemaleChineseName();
英文名
1
2
//生成1个随机英文人名
RandomSource.personInfoSource().randomEnglishName();
随机生成符合规则的虚拟身份证号码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//生成1个随机的虚拟身份证号码,地区为广西壮族自治区,男性,出生日期在1990年11月11日至1999年12月12日之间
LocalDate beginDate = LocalDate.of(1990,11,11);
LocalDate endDate = LocalDate.of(1999,12,12);
String id1 = RandomSource.personInfoSource().randomMaleIdCard(Province.GX, beginDate, endDate);

//生成1个随机的虚拟身份证号码,地区为河北省,女性,出生日期在2001年1月11日至2008年2月22日之间
LocalDate beginDate2 = LocalDate.of(2001,1,11);
LocalDate endDate2 = LocalDate.of(2008,2,22);
String id2 = RandomSource.personInfoSource().randomFemaleIdCard(Province.HE, beginDate2, endDate2);

//生成1个随机的虚拟身份证号码,地区为广西壮族自治区,男性,年龄为18岁
String id3 = RandomSource.personInfoSource().randomMaleIdCard(Province.GX, 18);

//生成1个随机的虚拟身份证号码,地区为河北省,女性,年龄为19岁
String id4 = RandomSource.personInfoSource().randomFemaleIdCard(Province.HE, 19);

注意:

  • 身份证号码前6位地区码数据取自民政部网站2019年公开数据
  • 随机生成的虚拟身份证号码符合校验规则,但有可能与真实号码相同(纯属巧合)
随机虚拟银行卡号码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//生成1个随机虚拟VISA信用卡号码
String cc1 = RandomSource.personInfoSource().randomCreditCardNo(CreditCardType.Visa);

//生成1个随机虚拟MasterCard信用卡号码
String cc2 = RandomSource.personInfoSource().randomCreditCardNo(CreditCardType.MasterCard);

//生成1个随机虚拟American Express信用卡号码
String cc3 = RandomSource.personInfoSource().randomCreditCardNo(CreditCardType.Amex);

//生成1个随机虚拟银联信用卡号码
String cc4 = RandomSource.personInfoSource().randomCreditCardNo(CreditCardType.UnionPay);

//生成1个随机虚拟JCB信用卡号码
String cc5 = RandomSource.personInfoSource().randomCreditCardNo(CreditCardType.JCB);

//生成1个随机虚拟借记卡(储蓄卡)号码
String dbc = RandomSource.personInfoSource().randomDebitCardNo();

注意:

  • 随机生成的虚拟银行卡号码只是前缀和位数符合规则,不会与现实中的真实卡号产生重合,无法用于支付,仅供模拟测试/仿真/项目演示等用途
随机中国大陆手机号
1
2
//生成1个随机中国大陆手机号
RandomSource.personInfoSource().randomChineseMobile();
随机邮箱地址
1
2
3
4
5
//生成1个随机邮箱地址,后缀随机,邮箱用户名最大长度为10
RandomSource.internetSource().randomEmail(10);

//生成1个随机邮箱地址,后缀为163.com,邮箱用户名最大长度为10
RandomSource.internetSource().randomEmail(10, "163.com");
随机域名
1
2
//生成1个随机域名,域名最大长度为16
RandomSource.internetSource().randomDomain(16);
随机ipv4地址
1
2
3
4
5
//生成1个随机公网IPv4地址
String pub = RandomSource.internetSource().randomPublicIpv4();

//生成1个随机私有(内网)IPv4地址
String prv = RandomSource.internetSource().randomPrivateIpv4();
随机ipv6地址
1
2
//生成1个随机ipv6地址
String ipv6 = RandomSource.internetSource().randomIpV6();
随机端口号
1
2
//生成1个随机端口号
RandomSource.internetSource().randomPort();
随机app信息
1
2
3
4
5
6
7
8
//生成1个随机App名称
String appName = RandomSource.internetSource().randomAppName();

//生成1个随机App Bundle ID
String appBundleID = RandomSource.internetSource().randomAppBundleId();

//生成1个随机App版本号
String appVersionCode = RandomSource.internetSource().randomAppVersionCode();
随机静态url
1
2
//生成1个随机静态url,后缀为jpg
String url = RandomSource.internetSource().randomStaticUrl("jpg");
随机日期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//生成1个2020年的随机日期,日期格式为yyyy-MM-dd
String d1 = RandomSource.dateTimeSource().randomDate(2020, "yyyy-MM-dd");

//生成1个2020年1月2日之后的随机日期,日期格式为yyyy-MM-dd
String d2 = RandomSource.dateTimeSource().randomFutureDate(LocalDate.of(2020,1,2), "yyyy-MM-dd");

//生成1个今天(基于系统时间判断)之后的随机日期,日期格式为yyyy-MM-dd
String d3 = RandomSource.dateTimeSource().randomFutureDate("yyyy-MM-dd");

//生成1个2020年1月2日之前1年内的随机日期,日期格式为yyyy-MM-dd
String d4 = RandomSource.dateTimeSource().randomPastDate(LocalDate.of(2020,1,2), "yyyy-MM-dd");

//生成1个今天(基于系统时间判断)之前1年内的随机日期,日期格式为yyyy-MM-dd
String d5 = RandomSource.dateTimeSource().randomPastDate("yyyy-MM-dd");

//生成1个2020年1月2日之前10年内的随机日期,日期格式为yyyy-MM-dd
String dd = RandomSource.dateTimeSource().randomPastDate(LocalDate.of(2020,1,2), 3650, "yyyy-MM-dd");

//生成1个2000年1月11日至2010年2月22日范围之间的随机日期,日期格式为yyyy-MM-dd
LocalDate beginDate = LocalDate.of(2000,1,11);
LocalDate endDate = LocalDate.of(2010,2,22);
String d6 = RandomSource.dateTimeSource().randomDate(beginDate, endDate, "yyyy-MM-dd");
随机时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//生成过去7天范围内的随机时间
LocalDateTime time1 = RandomSource.dateTimeSource().randomPastTime(7);

//生成未来7天范围内的随机时间
LocalDateTime time2 = RandomSource.dateTimeSource().randomFutureTime(7);

//生成2020年2月14日当天范围内的随机时间
LocalDateTime time3 = RandomSource.dateTimeSource().randomTime(2020, 2, 14);

//生成过去100秒范围内的随机时间
LocalDateTime time4 = RandomSource.dateTimeSource().randomPastTime(LocalDateTime.now(), 100);

//生成未来100秒范围内的随机时间
LocalDateTime time5 = RandomSource.dateTimeSource().randomFutureTime(LocalDateTime.now(), 100);
随机时间戳
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//生成1个当天范围内的随机时间戳
long ts1 = RandomSource.dateTimeSource().randomTimestamp(LocalDate.now());

//生成1个2020年3月6日范围内的随机时间戳
long ts2 = RandomSource.dateTimeSource().randomTimestamp(LocalDate.of(2020, 3, 6));

//生成1个介于2020年3月6日12:00:00至2020年3月6日12:30:00之间的随机时间戳
LocalDateTime begin = LocalDateTime.of(2020, 3, 6, 12, 0, 0);
LocalDateTime end = LocalDateTime.of(2020, 3, 6, 12, 30, 0);
long ts3 = RandomSource.dateTimeSource().randomTimestamp(begin, end);

//生成1个2020年3月6日12:00:00之后180秒内的随机时间戳
LocalDateTime base1 = LocalDateTime.of(2020, 3, 6, 12, 0, 0);
long ts4 = RandomSource.dateTimeSource().randomFutureTimestamp(base1, 180);

//生成1个2020年3月7日13:00:00之前120秒内的随机时间戳
LocalDateTime base2 = LocalDateTime.of(2020, 3, 7, 13, 0, 0);
long ts5 = RandomSource.dateTimeSource().randomPastTimestamp(base2, 120);
随机时区名称
1
2
//生成1个随机时区名称
String timezone = RandomSource.dateTimeSource().randomTimezoneName();
随机强密码
1
2
3
4
5
//生成1个随机强密码,长度为16,无特殊字符
RandomSource.personInfoSource().randomStrongPassword(16, false);

//生成1个随机强密码,长度为16,有特殊字符
RandomSource.personInfoSource().randomStrongPassword(16, true);
随机地址
1
2
3
4
5
6
7
8
9
10
11
//随机获取省份
RandomSource.areaSource().randomProvince();

//随机获取城市(省份+城市,以逗号为分隔符)
RandomSource.areaSource().randomCity(",");

//随机获取邮编
RandomSource.areaSource().randomZipCode();

//生成1个随机中国大陆详细地址
RandomSource.areaSource().randomAddress();
随机国家或地区
1
2
3
4
5
//随机获取1个编码首字母为b的国家或地区
RandomSource.areaSource().randomCountryOrRegionCode("b");

//随机获取1个国家或地区(不限首字母)
RandomSource.areaSource().randomCountryOrRegionCode();
随机经纬度
1
2
3
4
5
//随机生成1个纬度
double lat = RandomSource.areaSource().randomLatitude();

//随机生成1个经度
double lng = RandomSource.areaSource().randomLongitude();
随机固话
1
2
3
4
5
//随机固话区号(省级行政区名称不需要包含后缀)
RandomSource.areaSource().randomPhoneCode("湖南");

//随机固话号码(使用-作为分隔符,默认的分隔符是空格)
RandomSource.areaSource().randomPhoneNumber("广东", "-");
随机中国大陆车牌号
1
2
3
4
5
//生成1个随机中国大陆车牌号(新能源车型)
RandomSource.otherSource().randomPlateNumber(true);

//生成1个随机中国大陆车牌号(非新能源车型)
RandomSource.otherSource().randomPlateNumber();
随机网络昵称
1
2
3
4
5
6
7
8
//生成1个随机英文网络昵称,最大长度为8个字符
RandomSource.personInfoSource().randomNickName(8);

//生成1个随机汉字网络昵称,最大长度为8个汉字
RandomSource.personInfoSource().randomChineseNickName(8);

//基于随机汉字网络昵称生成1个拼音网络昵称,最大长度为4个汉字
RandomSource.personInfoSource().randomPinyinNickName(4);
随机qq信息
1
2
3
4
5
//生成1个随机QQ号
RandomSource.personInfoSource().randomQQAccount();

//生成1个随机非主流QQ网名
RandomSource.personInfoSource().randomQQNickName();
随机民族名称
1
RandomSource.otherSource().randomEthnicName();
随机教育背景信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//随机获取学历
RandomSource.educationSource().randomDegree();

//随机获取本科高校名称
RandomSource.educationSource().randomCollege();

//随机高校专业名称
RandomSource.educationSource().randomMajorName();

//随机获取小学名称
RandomSource.educationSource().randomPrimarySchoolName();

//随机获取小学年级
RandomSource.educationSource().randomPrimarySchoolGrade();

//随机获取中学名称
RandomSource.educationSource().randomHighSchoolName();

//随机获取中学年级
RandomSource.educationSource().randomHighSchoolGrade();

//随机班级名称
RandomSource.educationSource().randomClassName();
随机公司及部门名称
1
2
3
4
5
//随机生成1个公司名称,地区前缀为北京
RandomSource.otherSource().randomCompanyName("北京");

//随机生成1个公司部门名称
RandomSource.otherSource().randomCompanyDepartment();
随机中文短句
1
2
//随机生成1条中文短句
RandomSource.languageSource().randomChineseSentence();
随机英文文本
1
2
//随机生成1条英文文本,包含10个单词
RandomSource.languageSource().randomEnglishText(10);
随机营销号
1
2
RandomSource.languageSource().randomNonsenseTitle("星期一", "下雨");
RandomSource.languageSource().randomNonsense("星期一", "下雨");
随机行业分类
1
RandomSource.otherSource().randomEconomicCategory();

说明:行业分类编码和名称来自国家统计局发布的公开数据

统一社会信用代码
1
RandomSource.otherSource().randomSocialCreditCode();
随机EAN
1
2
3
4
5
6
7
8
//随机ISBN,返回结果需要分隔符-,格式例如:978-7-XXXX-XXXX-X
RandomSource.otherSource().randomISBN(true);

//随机ISBN,返回结果不需要分隔符,格式例如:9787XXXXXXXXX
RandomSource.otherSource().randomISBN(false);

//随机国际商品编码,格式例如:691XXXXXXXXXX
RandomSource.otherSource().randomEAN();

说明:

  • 本程序随机生成的EAN编码长度为13位
  • 本程序随机生成的EAN编码符合标准校验规则,仅供模拟测试/仿真/项目演示等用途,并不表示现实中真实存在该编码对应的商品(如有雷同纯属巧合)
随机useragent
1
2
3
4
5
6
7
8
//随机生成1个PC User-Agent
RandomSource.internetSource().randomPCUserAgent();

//随机生成1个Android User-Agent
RandomSource.internetSource().randomAndroidUserAgent();

//随机生成1个iOS User-Agent
RandomSource.internetSource().randomIOSUserAgent();
随机网卡mac地址
1
2
//随机生成1个网卡MAC地址,使用:作为分隔符
RandomSource.internetSource().randomMacAddress(":");
随机颜色值
1
2
3
4
5
//随机生成1个RGB颜色值
int[] rgb = RandomSource.otherSource().randomRgbColor();

//随机生成1个16进制(HEX)颜色值
String hex = RandomSource.otherSource().randomHexColor();
股票名称和股票代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//随机股票信息(沪A+深A+创业板+科创版)
String[] stock = RandomSource.financialSource().randomStock();
String stockName = stock[0];
String stockCode = stock[1];

//随机股票信息(港股)
String[] hkStock = RandomSource.financialSource().randomHKStock();
String hkStockName = hkStock[0];
String hkStockCode = hkStock[1];

//随机股票信息(新三板)
String[] xsbStock = RandomSource.financialSource().randomXsbStock();
String xsbStockName = xsbStock[0];
String xsbStockCode = xsbStock[1];

//随机股票信息(北交所)
String[] bseStock = RandomSource.financialSource().randomBseStock();
String bseStockName = bseStock[0];
String bseStockCode = bseStock[1];

//随机股票代码(纳斯达克)
RandomSource.financialSource().randomNasdaqStock();
开放式基金名称和基金代码
1
2
3
String[] fund = RandomSource.financialSource().randomFund();
String fundName = fund[0];
String fundCode = fund[1];
日k线数据
1
2
//随机生成20210201~20210228日期范围内的K线数据,起始价格为100,单日最大涨幅10%,单日最大跌幅-10%
List<KChartData> kList = RandomSource.financialSource().randomDailyKChartData(100, 0.1, -0.1, "20210201", "20210228");
货币
1
2
//随机获取一种货币信息
CurrencyInfo ci = RandomSource.financialSource().randomCurrencyInfo();
足球联赛球队名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//英超
RandomSource.sportSource().randomFootballTeam(CompetitionType.PREMIER_LEAGUE);

//西甲
RandomSource.sportSource().randomFootballTeam(CompetitionType.LA_LIGA);

//德甲
RandomSource.sportSource().randomFootballTeam(CompetitionType.BUNDESLIGA);

//意甲
RandomSource.sportSource().randomFootballTeam(CompetitionType.SERIE_A);

//法甲
RandomSource.sportSource().randomFootballTeam(CompetitionType.LIGUE_1);

//荷甲
RandomSource.sportSource().randomFootballTeam(CompetitionType.EREDIVISIE);
篮球联赛球队名称
1
2
3
4
5
//CBA
RandomSource.sportSource().randomBasketballTeam(CompetitionType.CBA);

//NBA
RandomSource.sportSource().randomBasketballTeam(CompetitionType.NBA);
国家及地区的足球代表队
1
2
3
4
5
6
7
8
//(亚洲足联范围内)随机足球队名称
RandomSource.sportSource().randomFootballTeam(FootballConfederation.AFC);

//(欧洲足联范围内)随机足球队名称
RandomSource.sportSource().randomFootballTeam(FootballConfederation.UEFA);

//随机足球队名称(不限足球联合会)
RandomSource.sportSource().randomFootballTeam();

访问 Wikipedia网页 可以查看完整的足球联合会列表信息。

热门手机型号
1
RandomSource.otherSource().randomMobileModel();
结语

功能很丰富,日常使用绝对可以i满足了,具体的请参考官方文档/代码