由于工作中经常会需要构建一些测试数据,而测试数据的准备又往往比较麻烦,随机造总是很麻烦,而且老是写重复代码,所以就有了这个工具包,可以快速的构建生成一些测试数据,测试数据的基准是贴近现实,看起来像那么一回事。
==与其他类似的工具最大的区别在于,很多数据考虑到真实性,并且相关的数据都有关联性,比如身份证、学校等等。==
详细说明文件请参考 数据构造器工具说明.md
(因为本地有太多的 README.md 文件,而我使用的编辑工具又是 typora,导致我想写文档的时候总是要多做好多操作,使用工具搜索文件每次找出一堆,所以就将md文件起一个别的名字,方便快速定位文档,然后想怎么写就怎么写了,但页面就需要点击一下跳转到文档页面了。)
说明:本工具依赖 hutool 和 lombok ,注意依赖冲突。
提供的数据工具
引用的API命名统一为 RandomXXXTool 。所有的生成工具都在 cn.sprouting.tool
目录下面。
所有的接口都是 get
开头。
API中提供了很多指定生成省市县的接口,这类如果没做特别说明,那么需要你在普通的省市县行政区划代码中添加0进行补充,因为我使用的行政区划到了街道级别,长度为 12
位。省市县代码可以参考 resources
下的 area.txt
文件。
这里非常感谢 hutool 工具类,如果有其他的随机需要,huTool 中的RandomUtils工具类值得拥有。
地址信息,往往并不是一个简单的字符串,地址中常见的包含省、市、区县以及详细的街道、具体住址信息,另外,大家还可能常用到省市区县的代码。
我这一份数据采集自 2020 年国家统计局信息,数据包含省市县以及街道信息,但实际使用中,大家一般不会使用到街道,因为街道太容易发生变动了,而我返回的省市区县代码也包含了街道级别,需要使用者自己进行截取。
使用示例:
Area area = RandomAreaTool.getArea();
System.out.println(area);
返回结果:
Area(province=江西省, provinceCode=360000000000, city=吉安市, cityCode=360800000000, county=永新县, countyCode=360830000000, street=三月坪街道, streetCode=360830001000, specific=长向东龙腾轩17栋2单元1103房, addressDetail=江西省吉安市永新县三月坪街道长向东龙腾轩17栋2单元1103房)
支持批量生成,以及指定省市县。
List<String> provinceCodeList = new ArrayList<>();
provinceCodeList.add("510000000000");
provinceCodeList.add("610000000000");
List<String> cityCodeList = new ArrayList<>();
cityCodeList.add("610200000000");
cityCodeList.add("610100000000");
cityCodeList.add("510100000000");
cityCodeList.add("510300000000");
List<Area> list = RandomAreaTool.getArea(10, provinceCodeList, cityCodeList, null);
System.out.println(list);
结果:
[Area(province=陕西省, provinceCode=610000000000, city=西安市, cityCode=610100000000, county=碑林区, countyCode=610103000000, street=柏树林街道, streetCode=610103002000, specific=荣沙西光华新天地18栋3单元0603房, addressDetail=陕西省西安市碑林区柏树林街道荣沙西光华新天地18栋3单元0603房), Area(province=陕西省, provinceCode=610000000000, city=西安市, cityCode=610100000000, county=长安区, countyCode=610116000000, street=五星街道, streetCode=610116021000, specific=百泽中东山名苑7栋4单元2604房, addressDetail=陕西省西安市长安区五星街道百泽中东山名苑7栋4单元2604房), Area(province=四川省, provinceCode=510000000000, city=成都市, cityCode=510100000000, county=简阳市, countyCode=510185000000, street=踏水镇, streetCode=510185119000, specific=仁北北阳光嘉苑2栋4单元2602房, addressDetail=四川省成都市简阳市踏水镇仁北北阳光嘉苑2栋4单元2602房), Area(province=四川省, provinceCode=510000000000, city=成都市, cityCode=510100000000, county=青羊区, countyCode=510105000000, street=光华街道, streetCode=510105009000, specific=荣瑞西时代悦府7栋1单元2702房, addressDetail=四川省成都市青羊区光华街道荣瑞西时代悦府7栋1单元2702房), Area(province=四川省, provinceCode=510000000000, city=自贡市, cityCode=510300000000, county=大安区, countyCode=510304000000, street=凤凰街道, streetCode=510304006000, specific=仁天北万象轩10栋3单元2602房, addressDetail=四川省自贡市大安区凤凰街道仁天北万象轩10栋3单元2602房)]
银行卡的生成只能说基本符合规范,实际上,每个银行有每个银行的规则,虽然基本都符合中国银联的标准,但实际中还有一些老的银行卡,根本无法通过校验,规则也是五花八门,如果真要获取真实的银行卡,该工具类是无法达到要求的。该工具类只能说是一个符合相应规律,但并非真实的银行卡。
银行卡的返回信息同样也是一个对象,对象中包含完整的银行卡(随机生成的假银行卡号码)、发卡行名称、卡种类型、银行卡类型,MII(产业标识符)等信息。
示例:
BankCard bank = RandomBankCardTool.getBank();
System.out.println(bank);
结果:
BankCard(card=62213592702176702556, issuer=成都商业银行, name=锦程卡, type=null, typeName=借记卡, iin=622135, mii=6, miiName=商业和金融财务, checkLuhm=false)
支持批量,支持指定银行
List<String> list = new ArrayList<>();
list.add("中国银行");
list.add("中国银行");
List<BankCard> bank = RandomBankCardTool.getBank(list, 3);
System.out.println(bank);
结果:
[BankCard(card=54764899938916855, issuer=中国银行, name=长城国际卡(港币卡)-商务普卡, type=null, typeName=贷记卡, iin=547648, mii=5, miiName=金融财务, checkLuhm=false), BankCard(card=60138260150132138756, issuer=中国银行, name=长城电子借记卡, type=null, typeName=借记卡, iin=601382, mii=6, miiName=商业和金融财务, checkLuhm=false), BankCard(card=62276219073246654, issuer=中国银行, name=长城信用卡, type=null, typeName=准贷记卡, iin=622762, mii=6, miiName=商业和金融财务, checkLuhm=false)]
示例:
String companyName = RandomCompanyTool.getCompanyName(null);
System.out.println(companyName);
String hn = RandomCompanyTool.getCompanyName("湖南省");
System.out.println(hn);
结果:
秉典才谈文化传播股份有限公司
湖南省窝哟叶传媒股份有限公司
其中生成部门需要注意一点,部门的生成是根据字典来了,而普通的部门数量不够多,故而,随机生成部门的时候很有可能会重复。
List<String> depName = RandomCompanyTool.getDepName(2);
System.out.println(depName);
结果:
[企划部, 总务部]
股票和基金的生成往往也需要一些其他辅助信息,比如股票对应的公司名称,A股代码,A股简称,上市时间,所在地点,数据来源截至2021年9月28日,内容为真实的A股上市公司数据。
示例:
List<ListedCompany> listedCompany = RandomFinancialTool.getListedCompany(3);
System.out.println(listedCompany);
结果:
[ListedCompany(name=浙江建业化工股份有限公司, code=603948, abbreviation=建业股份, timeToMarket=2020-3-2, city=浙江省杭州市), ListedCompany(name=海南葫芦娃药业集团股份有限公司, code=605199, abbreviation=葫芦娃, timeToMarket=2020-7-10, city=海南省海口市), ListedCompany(name=新疆鑫泰天然气股份有限公司, code=603393, abbreviation=新天然气, timeToMarket=2016-9-12, city=新疆维吾尔自治区乌鲁木齐市)]
基金的信息则返回比较少,只返回了基金名称和基金代码
List<Fund> fund = RandomFinancialTool.getFund(3);
System.out.println(fund);
结果:
[Fund(name=海富通沪深300指数增强C, code=004512), Fund(name=国寿安保沪深300ETF联接, code=000613), Fund(name=大摩领先优势混合, code=233006)]
身份证信息是数据中最重要的一个证件信息,而这个数据也往往不知需要一个简单的身份证号码,所以也会返回一个身份证对象,包含身份证号码、性别、生日、对应省市区县。
生成身份证支持指定出生年月,指定性别以及省。
不指定则使用默认的。
List<IdCard> idCard = RandomIDCardTool.getIDCard(1, null, null, null, null);
System.out.println(idCard);
结果:
[IdCard(cardNo=370203195809199672, sex=1, sexName=男, birthday=19580919, province=山东省, provinceCode=370000, city=青岛市, cityCode=370200, county=市北区, countyCode=370203)]
车牌的生成支持指定车牌前缀,一般如 晋、云、甘、湘等等。
// 简单生成
String licensePlate = RandomLicensePlateTool.getLicensePlate();
System.out.println(licensePlate);
// 指定生成湖南的新能源车牌
String plate = RandomLicensePlateTool.getLicensePlate(true, "湘");
System.out.println(plate);
结果:
吉VD9089T
湘GD422E1
中药和西药的随机生成都是采用字典的模式,故而有数量限制,在获取的时候建议批量获取。同样可以指定省市县。
// 医院名称
List<String> hospitalName = RandomMedicineTool.getHospitalName(1, null, null, null);
System.out.println(hospitalName);
// 中药名称
List<String> chineseMedicineName = RandomMedicineTool.getChineseMedicineName(2);
System.out.println(chineseMedicineName);
// 病症名称
List<String> disease = RandomMedicineTool.getDisease(3);
System.out.println(disease);
// 西药
List<String> westernMedicineName = RandomMedicineTool.getWesternMedicineName(2);
System.out.println(westernMedicineName);
结果:
[苏州市武警医院]
[川椒, 商陆]
[子宫阴道不完全性脱垂, 先天性双侧腭裂, 产褥期深静脉血栓形成]
[阿伐斯汀(抗组胺药), 阿度西林(抗生素类药)]
示例:
// 姓名
List<String> name = RandomNameTool.getName(3, Constant.Sex.FEMALE);
// 真实姓名
List<User> realName = RandomNameTool.getRealName(3, Constant.SexInteger.FEMALE);
List<User> realNameMale = RandomNameTool.getRealName(3, Constant.SexInteger.MALE);
// 中文昵称
String chineseNickName = RandomNameTool.getChineseNickName(3, 5);
// 生成男孩名称
String nameBoy = RandomNameTool.getNameBoy();
List<String> nameEnglish = RandomNameTool.getNameEnglish(3);
System.out.println(name);
System.out.println(realName);
System.out.println(realNameMale);
System.out.println(chineseNickName);
System.out.println(nameBoy);
System.out.println(nameEnglish);
结果
[贾慧, 阎萍, 谭琦丹]
[User(name=杨君, sex=0), User(name=王海潮, sex=0), User(name=刘扬凡, sex=0)]
[User(name=李桂漫, sex=1), User(name=袁泺添, sex=1), User(name=廖增智, sex=1)]
菊凡娥梅
何浩刚
[Ishara, Nathaniel, Sidney]
需要说明的是,选择生成真实姓名的时候,该方式采用的也是字典模式,好处是生成的名字都是真实存在的,缺点是会读取字典文件,大约有2W个,故而,应该批量获取。
学校生成采用的同样是字典模式,主要提供了大学、小学、中学、班级、年级的信息生成。除了大学,其他未采用字典模式,请注意。
大学分两类,一类是普通高等大学,还有一类是成人高等大学,这两类数据都是根据2019年教育部名单生成,除了提供学校的名称,还提供了学校标识码,全国有且唯一的编号,教育部统编,主管部门,所在省或直辖市名称、学校所在地、办学层次、是否民办等信息。
// 小学
// 可以指定学校的省市县,也可以不指定,直接调用其他方法
List<String> primarySchoolName = RandomSchoolTool.getPrimarySchoolName(3, null, null, null);
System.out.println(primarySchoolName);
// 中学名称
String middleSchoolName = RandomSchoolTool.getMiddleSchoolName();
System.out.println(middleSchoolName);
// 成人高等学校
List<University> adultCollegesAndUniversities = RandomSchoolTool.getAdultCollegesAndUniversities(3);
System.out.println(adultCollegesAndUniversities);
// 普通高校
List<University> collegesAndUniversities = RandomSchoolTool.getCollegesAndUniversities(3);
System.out.println(collegesAndUniversities);
结果:
[霍城县第二小学, 扶绥县第一小学, 蒙自市第二小学]
朔城区第四中学
[University(name=浙江经济管理职工大学, code=4233051259, competentDep=浙江省, province=浙江省, location=null, layer=null, civilianRun=false), University(name=黑龙江省社会科学院职工大学, code=4223051745, competentDep=黑龙江省, province=黑龙江省, location=null, layer=null, civilianRun=false), University(name=贵州铝厂职工大学, code=4252050962, competentDep=贵州省, province=贵州省, location=null, layer=null, civilianRun=false)]
[University(name=成都农业科技职业学院, code=4151012965, competentDep=四川省, province=四川省, location=成都市, layer=专科, civilianRun=false), University(name=河西学院, code=4162010740, competentDep=甘肃省, province=甘肃省, location=张掖市, layer=本科, civilianRun=false), University(name=陕西旅游烹饪职业学院, code=4161014031, competentDep=陕西省教育厅, province=陕西省, location=西安市, layer=专科, civilianRun=true)]
统一社会信用代码是现在基本大部分的社会组织都拥有的一个标识,维基上也可以查询到组成方式。
组成方式: 登记部门码 + 机构类别码 + 登记管理机关行政区划码 + 主体标识码(组织机构代码) + 校验码
登记管理部门码表示登记管理部分,使用阿拉伯数字或大写英文字母表示,1代表机构编制、5代表民政、9代表工商、Y代表其他。
机构类别码表示登记机构的类别。机构类别代码。“1”表示社会团体、“2”表示民办非企业单位、“3”表示基金会、“9”表示其他
登记管理机关行政区划码指的是登记机构所地的行政区划代码,如350100是福建省福州市。
主体标识码(组织机构代码)是旧的组织机构代码,按照GB 11714编码。
最后一位是校验码,校验码计算方法参照GB/T 17710(采ISO 7064)。
然而虽然有比较多的资料,但生成一个统一信用代码并不是那么简单,主要在主体识别码的生成,这一块是有很多标识信息的,实在无法完整的查询到,另外,还有一些早期的组织信息,作为试点生成的代码也不符合规范,最后,在这一块代码生成上,我采用了两种方案,一种是字典,采集自国家企业信用公示系统,这一块的数据都是真实存在,有的企业已经注销,但还有在存续状态的,需要说明的是,统一社会信用代码与企业的注册地、企业类型,注册机构等等都有密切关系,和省份之类的也有联系,在使用的时候需要注意到这一点,真实统一社会信用代码请勿用于非法用途,无意中采集到您的统一社会信用代码,请联系我进行处理。
// 虚假但基本符合规则的统一社会信用代码
List<String> unifiedCreditCode = RandomUnifiedCreditCodeTool.getUnifiedCreditCode(3, null);
System.out.println(unifiedCreditCode);
// 真实
List<String> realUnifiedCreditCode = RandomUnifiedCreditCodeTool.getRealUnifiedCreditCode(3);
System.out.println(realUnifiedCreditCode);
结果:
[91330523M1D7CD7CG3, 91411721M3NRR2XGI1, 91420325M8QIDYZ4C2]
[92520121MA6HUF9X5Y, 92440300MA5FPR7A6F, 91410225MA474C5W9W]
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。