# supermock
**Repository Path**: ppcirgo/supermock
## Basic Information
- **Project Name**: supermock
- **Description**: 这是一款高效的数据模拟工具,它支持多种数据类型的模拟,并通过声明式描述简化了模拟逻辑的定义。此外,该工具能够根据设定的策略,将数据自动发送至ES、Kafka、JDBC等多种存储介质,为用户提供了灵活的数据生成和分发方案。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://coder69.cn
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2024-05-23
- **Last Updated**: 2024-11-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 数据模拟, Java
## README
## 0.环境依赖
- JDK17+
- Springboot3.2.5
- H2DB
## 1.动机
还是没忍住,想打造一款强大的数据模拟软件。那么强大在哪些方面呢?
方面1:支持生成结构化的数据以及非结构化的数据
- 结构化的数据支持输出json、csv、tsv格式
- 非结构化的数据仅支持json格式输出
方面2:支持多种数据类型模拟
- 整数 int、long
- 小数 double
- 文本 string
- 布尔 bool
- ip ip4、ip6
- 正则 regex
- 数组 以上所有类型的数组类型
方面3:支持多种模拟策略
- 整数 范围随机、枚举随机、步进递增递减
- 小数 范围随机、枚举随机
- 布尔 支持设置true/false比例
- 文本 枚举随机、uuid
- ip 范围随机、枚举随机
- 正则 正则随机
> 枚举支持复合,例如可枚举uuid.
方面4:支持多种发送方式
- 保存在本地磁盘
- socket
- http接口
- grpc接口
- jdbc接口
- 发送到es
- 发送到kafka
- 发送到hdfs
- 待增加...
> 注:
> ①发送的数据,既可以源于模拟之后,也可以源于本地文件
> ②支持上述接口的安全层,ssl或tls认证
> ③支持配置发送抖动,例如第1秒发送10条,第2秒发送3条...
> ④支持单次任务、周期任务、cron任务
方面5:提供UI界面
- 配置模拟任务
- 监控模拟进度
- 监控发送进度
---
基于此,在大多数场景可以快速测试。
## 2.功能
例如我们有这样一个DSL表达,其表示一条记录的规则:
```json
{
"id": "int;incr[0,1]", // int类型,从0开始,递增步进为1
"userId": "string;uuid[format/noformat,lower/upper]", // 生成uuid,格式化,小写
"storeId": "string;ref{3}uuid[noformat,upper]", // 枚举常量,自动生成3个uuid作为枚举值
"addrs": [
2, //数组长度为2
"string;enum[重庆市潼南区,山西省运城市,太原市场,西安市]" // 代表数组元素是一个基本类型
],
"names": [
3,
{
"isGirl": "bool;ratio[true,60]", // 模拟生成bool类型,且true占比为60%,范围[0,100]
"name": "string;enum[刘周,xiao,榴莲,5566,ppcirgo,阿飞]",
"age": "int;range[30,70]",
"arr": [
5,
"int;range[10,30]"
]
}
],
"other": "int;enum[1,3,6,7]",
"email": "string;regex:[a-z]{6}\\@[a-z]{3}\\.com" // 支持常规正则表达式
}
```
实际模拟出来的数据形如:
```json
{
"userId" : "8a96a81c-df97-467a-afbc-e085e2ffef51",
"storeId" : "42F242BB-40F5-4566-A398-660EEFF33F60",
"addrs" : [ "西安市", "山西省运城市" ],
"names" : [ {
"id" : 9000,
"isGirl" : true,
"name" : "榴莲",
"age" : 54,
"arr" : [ 26, 27, 26, 16, 11 ]
}, {
"id" : 8999,
"isGirl" : true,
"name" : "xiao",
"age" : 67,
"arr" : [ 18, 20, 29, 24, 24 ]
}, {
"id" : 8998,
"isGirl" : true,
"name" : "ppcirgo",
"age" : 31,
"arr" : [ 27, 10, 18, 30, 28 ]
} ],
"other" : 3,
"email" : "efbubd@niy.com"
}
```