# dataTool **Repository Path**: sprouting/data-tool ## Basic Information - **Project Name**: dataTool - **Description**: 一个用于生成各种测试数据,方便快速生成的工具 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 18 - **Forks**: 11 - **Created**: 2021-10-25 - **Last Updated**: 2025-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 测试数据生成工具 由于工作中经常会需要构建一些测试数据,而测试数据的准备又往往比较麻烦,随机造总是很麻烦,而且老是写重复代码,所以就有了这个工具包,可以快速的构建生成一些测试数据,测试数据的基准是贴近现实,看起来像那么一回事。 ==与其他类似的工具最大的区别在于,很多数据考虑到真实性,并且相关的数据都有关联性,比如身份证、学校等等。== 详细说明文件请参考 [数据构造器工具说明.md](https://gitee.com/sprouting/data-tool/blob/master/%E6%95%B0%E6%8D%AE%E6%9E%84%E9%80%A0%E5%99%A8%E5%B7%A5%E5%85%B7%E8%AF%B4%E6%98%8E.md) (因为本地有太多的 README.md 文件,而我使用的编辑工具又是 typora,导致我想写文档的时候总是要多做好多操作,使用工具搜索文件每次找出一堆,所以就将md文件起一个别的名字,方便快速定位文档,然后想怎么写就怎么写了,但页面就需要点击一下跳转到文档页面了。) 说明:本工具依赖 hutool 和 lombok ,注意依赖冲突。 提供的数据工具 - 随机生成地区、包括省市县街道房间 - 银行卡 - 出版社 - ISBN号 - 公司名称、公司部门 - 学历 - 邮箱 - 基金、股票信息 - 身份证 - 车牌,包括新能源车牌 - 经纬度 - 医院名称、疾病名称、西药名称、中药名称 - 真实姓名、虚拟姓名、昵称,英文名称 - 网络URL,IPv4、IPv6、mac地址、端口、QQ号 - 强密码生成 - 小学名称、中学名称、985(真实)、211大学(真实)、班级 - 移动、联通、电信手机、固话 - 汉字随机生成 - 统一信用代码、真实统一信用代码 - 民族 ### 命名说明 引用的API命名统一为 RandomXXXTool 。所有的生成工具都在 `cn.sprouting.tool` 目录下面。 所有的接口都是 `get` 开头。 ### 省市县说明 API中提供了很多指定生成省市县的接口,这类如果没做特别说明,那么需要你在普通的省市县行政区划代码中添加0进行补充,因为我使用的行政区划到了街道级别,长度为 `12` 位。省市县代码可以参考 `resources` 下的 `area.txt` 文件。 ### 其他说明 这里非常感谢 hutool 工具类,如果有其他的随机需要,huTool 中的RandomUtils工具类值得拥有。 官方链接:https://www.hutool.cn/ ## [部分] API 说明 ### 地址生成 地址信息,往往并不是一个简单的字符串,地址中常见的包含省、市、区县以及详细的街道、具体住址信息,另外,大家还可能常用到省市区县的代码。 我这一份数据采集自 2020 年国家统计局信息,数据包含省市县以及街道信息,但实际使用中,大家一般不会使用到街道,因为街道太容易发生变动了,而我返回的省市区县代码也包含了街道级别,需要使用者自己进行截取。 使用示例: ```java Area area = RandomAreaTool.getArea(); System.out.println(area); ``` 返回结果: ```properties Area(province=江西省, provinceCode=360000000000, city=吉安市, cityCode=360800000000, county=永新县, countyCode=360830000000, street=三月坪街道, streetCode=360830001000, specific=长向东龙腾轩17栋2单元1103房, addressDetail=江西省吉安市永新县三月坪街道长向东龙腾轩17栋2单元1103房) ``` 支持批量生成,以及指定省市县。 ```java List provinceCodeList = new ArrayList<>(); provinceCodeList.add("510000000000"); provinceCodeList.add("610000000000"); List cityCodeList = new ArrayList<>(); cityCodeList.add("610200000000"); cityCodeList.add("610100000000"); cityCodeList.add("510100000000"); cityCodeList.add("510300000000"); List list = RandomAreaTool.getArea(10, provinceCodeList, cityCodeList, null); System.out.println(list); ``` 结果: ```properties [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(产业标识符)等信息。 示例: ```java BankCard bank = RandomBankCardTool.getBank(); System.out.println(bank); ``` 结果: ```properties BankCard(card=62213592702176702556, issuer=成都商业银行, name=锦程卡, type=null, typeName=借记卡, iin=622135, mii=6, miiName=商业和金融财务, checkLuhm=false) ``` 支持批量,支持指定银行 ```java List list = new ArrayList<>(); list.add("中国银行"); list.add("中国银行"); List bank = RandomBankCardTool.getBank(list, 3); System.out.println(bank); ``` 结果: ```properties [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)] ``` ### 企业 示例: ```java String companyName = RandomCompanyTool.getCompanyName(null); System.out.println(companyName); String hn = RandomCompanyTool.getCompanyName("湖南省"); System.out.println(hn); ``` 结果: ```properties 秉典才谈文化传播股份有限公司 湖南省窝哟叶传媒股份有限公司 ``` 其中生成部门需要注意一点,部门的生成是根据字典来了,而普通的部门数量不够多,故而,随机生成部门的时候很有可能会重复。 ```java List depName = RandomCompanyTool.getDepName(2); System.out.println(depName); ``` 结果: ```properties [企划部, 总务部] ``` ### 股票基金 股票和基金的生成往往也需要一些其他辅助信息,比如股票对应的公司名称,A股代码,A股简称,上市时间,所在地点,数据来源截至2021年9月28日,内容为真实的A股上市公司数据。 示例: ```java List listedCompany = RandomFinancialTool.getListedCompany(3); System.out.println(listedCompany); ``` 结果: ```properties [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=新疆维吾尔自治区乌鲁木齐市)] ``` 基金的信息则返回比较少,只返回了基金名称和基金代码 ```java List fund = RandomFinancialTool.getFund(3); System.out.println(fund); ``` 结果: ```properties [Fund(name=海富通沪深300指数增强C, code=004512), Fund(name=国寿安保沪深300ETF联接, code=000613), Fund(name=大摩领先优势混合, code=233006)] ``` ### 身份证 身份证信息是数据中最重要的一个证件信息,而这个数据也往往不知需要一个简单的身份证号码,所以也会返回一个身份证对象,包含身份证号码、性别、生日、对应省市区县。 生成身份证支持指定出生年月,指定性别以及省。 不指定则使用默认的。 ```java List idCard = RandomIDCardTool.getIDCard(1, null, null, null, null); System.out.println(idCard); ``` 结果: ```properties [IdCard(cardNo=370203195809199672, sex=1, sexName=男, birthday=19580919, province=山东省, provinceCode=370000, city=青岛市, cityCode=370200, county=市北区, countyCode=370203)] ``` ### 车牌 车牌的生成支持指定车牌前缀,一般如 晋、云、甘、湘等等。 ```java // 简单生成 String licensePlate = RandomLicensePlateTool.getLicensePlate(); System.out.println(licensePlate); // 指定生成湖南的新能源车牌 String plate = RandomLicensePlateTool.getLicensePlate(true, "湘"); System.out.println(plate); ``` 结果: ```properties 吉VD9089T 湘GD422E1 ``` ### 医疗 中药和西药的随机生成都是采用字典的模式,故而有数量限制,在获取的时候建议批量获取。同样可以指定省市县。 ```java // 医院名称 List hospitalName = RandomMedicineTool.getHospitalName(1, null, null, null); System.out.println(hospitalName); // 中药名称 List chineseMedicineName = RandomMedicineTool.getChineseMedicineName(2); System.out.println(chineseMedicineName); // 病症名称 List disease = RandomMedicineTool.getDisease(3); System.out.println(disease); // 西药 List westernMedicineName = RandomMedicineTool.getWesternMedicineName(2); System.out.println(westernMedicineName); ``` 结果: ```properties [苏州市武警医院] [川椒, 商陆] [子宫阴道不完全性脱垂, 先天性双侧腭裂, 产褥期深静脉血栓形成] [阿伐斯汀(抗组胺药), 阿度西林(抗生素类药)] ``` ### 姓名 示例: ```java // 姓名 List name = RandomNameTool.getName(3, Constant.Sex.FEMALE); // 真实姓名 List realName = RandomNameTool.getRealName(3, Constant.SexInteger.FEMALE); List realNameMale = RandomNameTool.getRealName(3, Constant.SexInteger.MALE); // 中文昵称 String chineseNickName = RandomNameTool.getChineseNickName(3, 5); // 生成男孩名称 String nameBoy = RandomNameTool.getNameBoy(); List 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); ``` 结果 ```properties [贾慧, 阎萍, 谭琦丹] [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年教育部名单生成,除了提供学校的名称,还提供了学校标识码,全国有且唯一的编号,教育部统编,主管部门,所在省或直辖市名称、学校所在地、办学层次、是否民办等信息。 ```java // 小学 // 可以指定学校的省市县,也可以不指定,直接调用其他方法 List primarySchoolName = RandomSchoolTool.getPrimarySchoolName(3, null, null, null); System.out.println(primarySchoolName); // 中学名称 String middleSchoolName = RandomSchoolTool.getMiddleSchoolName(); System.out.println(middleSchoolName); // 成人高等学校 List adultCollegesAndUniversities = RandomSchoolTool.getAdultCollegesAndUniversities(3); System.out.println(adultCollegesAndUniversities); // 普通高校 List collegesAndUniversities = RandomSchoolTool.getCollegesAndUniversities(3); System.out.println(collegesAndUniversities); ``` 结果: ```properties [霍城县第二小学, 扶绥县第一小学, 蒙自市第二小学] 朔城区第四中学 [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)。 ``` 然而虽然有比较多的资料,但生成一个统一信用代码并不是那么简单,主要在主体识别码的生成,这一块是有很多标识信息的,实在无法完整的查询到,另外,还有一些早期的组织信息,作为试点生成的代码也不符合规范,最后,在这一块代码生成上,我采用了两种方案,一种是字典,采集自国家企业信用公示系统,这一块的数据都是真实存在,有的企业已经注销,但还有在存续状态的,需要说明的是,统一社会信用代码与企业的注册地、企业类型,注册机构等等都有密切关系,和省份之类的也有联系,在使用的时候需要注意到这一点,真实统一社会信用代码请勿用于非法用途,无意中采集到您的统一社会信用代码,请联系我进行处理。 ```java // 虚假但基本符合规则的统一社会信用代码 List unifiedCreditCode = RandomUnifiedCreditCodeTool.getUnifiedCreditCode(3, null); System.out.println(unifiedCreditCode); // 真实 List realUnifiedCreditCode = RandomUnifiedCreditCodeTool.getRealUnifiedCreditCode(3); System.out.println(realUnifiedCreditCode); ``` 结果: ```properties [91330523M1D7CD7CG3, 91411721M3NRR2XGI1, 91420325M8QIDYZ4C2] [92520121MA6HUF9X5Y, 92440300MA5FPR7A6F, 91410225MA474C5W9W] ```