brook 文档

项目github仓库:brook,欢迎star或提交pull

背景

日常工作中,经常需要一些用户信息的测试数据,比如身份证手机号码银行卡姓名(这四类信息称为四要素)等等。一般情况下比较便捷的做法:

  • Java:定义一个类里面放一些常用的身份证前缀,银行卡 bin 等,然后通过随机生成
  • Python: 定义多个字典,字典也是放一些常用的数据,也通过组合或者随机生成
  • 其他: 跟上述原理差得不多

但是存在会存在一些问题

  • 重复造轮子:小张的项目自己写了一套 utils 类,小红的项目里面又另外写了一套 utils 类
  • 功能单一: 造的轮子相对简单,只能生成一些相对固定的数据

如果将这些大家用得特别多的数据,通过一个统一的工具类来生成,会不会给大家带来便利呢?答案是肯定的:

  • 用法简单:一个链式调用即可生成想要的数据
  • 功能多样:根据不同的条件生成不同的测试数据,满足不同的业务需求
  • 减少造轮子成本
  • 数据严谨: 生成的身份证完全遵循【六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码】;银行卡 bin 完全可以通过阿里的银行卡校验接口;姓名由姓氏和名字组合,姓氏来自 wiki 百科人数总数前 400 的姓,名字来自某数据库内 120 万条去重去掉不优雅的数据; 等等

使用方法

pom 中加入依赖:

1
2
3
4
5
<dependency>
<groupId>cn.nothinghere</groupId>
<artifactId>brook</artifactId>
<version>${lastVersion}</version>
</dependency>

最新版本:注意版本号前面无需加v,比如0.0.1即可:

v

身份证

1
2
3
4
5
6
7
String idCard = DataFactory.idCardBuilder()
.withProvince(Province.HEBEI)
.withCity(City.TANGSHAN)
.withDistrict("古冶区")
.withAge(18, 31)
.withGender(Gender.FEMALE)
.build();

入参全部非必填

方法入参说明
withProvince()Province建议采用枚举类的方式
withProvince()String不建议手动传入某个省的字符串类型
withCity()City建议采用枚举类的方式
withCity()String不建议手动传入某个市的字符串类型
withDistrict()String因为的数据太多,没有单独定义成枚举类
withAge()int指定固定的年龄
withAge()int, int指定年龄区间,后一个年龄不包含
withGender()Gender男性:Gender.MALE;女性:Gender.FEMALE
withBirthday()String指定生日,格式为:yyyyMMdd,不要和年龄一起用

银行卡

1
2
3
4
5
String bankCardNo = DataFactory.bankCardBuilder()
.withBank(StateBank.ABC)
.withType(BankCardType.DC)
.withLength(16)
.build();

入参全部非必填

方法入参说明
withBank()BankStateBank:大型银行 OR 股份制银行;CityBank:城市商业银行,小银行用得不多
withType()BankCardTypeDC: “储蓄卡”, CC: “信用卡”, SCC: “准贷记卡”, PC: “预付费卡”
withLength()int银行卡号长度,一般是 16~19

手机号码

1
2
3
String phone = DataFactory.phoneBuilder()
.withOperator(Operator.CMCC)
.build();

入参非必填

方法入参说明
withOperator()Operator移动:CMCC, 联通:CUCC, 电信:CTCC

姓名

1
2
3
4
String name = DataFactory.nameBuilder()
.withGender(Gender.MALE)
.withLength(3)
.build();

生成数据样例:

张玉虎
黄昌明

入参全部非必填

方法入参说明
withGender()Gender男性:Gender.MALE;女性:Gender.FEMALE
withLength()int2 字,3 字,4 字

邮箱

1
2
3
String email = DataFactory.emailBuilder()
.withName("王思聪")
.build();

生成数据样例:

wangsicong@outlook.com

入参全部非必填

方法入参说明
withName()String中文 OR 英文,中文会自动转为拼音,英文无变化

地址

注意这里后面还会做修改,因为实际上地址不可能只有省+市+区,等有空闲时间会逐渐细分到 xx 镇 xx 村等等;

1
2
3
4
5
String address = DataFactory.addressBuilder()
.withProvince(Province.HEBEI)
.withCity(City.TANGSHAN)
.withDistrict("古冶区")
.build();

生成数据样例:

河北省唐山市古冶区

入参全部非必填:

方法入参说明
withProvince()Province建议采用枚举类的方式
withProvince()String不建议手动传入某个省的字符串类型
withCity()City建议采用枚举类的方式
withCity()String不建议手动传入某个市的字符串类型
withDistrict()String因为的数据太多,没有单独定义成枚举类

职业

1
2
3
String occupation = DataFactory.occupationBuilder()
.withType(MajorType.PROFESSION)
.build();

生成数据样例:

电气工程技术人员

入参全部非必填

方法入参说明
withType()职业类型8 大类,具体可见cn.nothinghere.brook.value.occupation.MajorType

车牌号

1
2
3
4
5
6
String licensePlate = DataFactory.licensePlateBuilder()
.withProvince(Province.HEBEI)
.withCity(City.TANGSHAN)
.withDistrict("古冶区")
.withType(PlateType.COMMON)
.build();

入参全部非必填:

方法入参说明
withProvince()Province建议采用枚举类的方式
withProvince()String不建议手动传入某个省的字符串类型
withCity()City建议采用枚举类的方式
withCity()String不建议手动传入某个市的字符串类型
withDistrict()String因为的数据太多,没有单独定义成枚举类
withType()PlateType车牌类型:COMMON-常用/普通车牌;MOTOR-摩托车;BUS-公交大巴;TAXI-出租车;FOREIGNER-外籍;TEMPORARY-临时

其他

待添加…