mockee
Python3 的模拟数据(JSON)生成工具。
安装
pip installmockee
用法
from mockee import Mockee
# 加载指定的定义文件
mock = Mockee('/path/to/deffile.json')
# 生成数据
data = mock.make('GET:/api/test', {
# 当时间/日期数据项表达式为 auto 时的自动计算使用,此情况下必传的
'date_range': ['2020-01-01', '2020-12-31'],
# 指定 date_range 中传入的日期格式
# 不指定时为 %Y-%m-%d %H:%M:%S
# 不会影响生成的日期数据格式
'date_fmt': '%Y-%m-%d',
# 整数自增长的基数(从此数值开始自增),不指定时为 `0`
'i_base': 0
})
/path/to/deffile.json 是模拟数据定义文件
GET:path 叫做数据标识,一般由请求的 method+url 组成
data 生成的数据。当未找到对应的声明时,返回 None
数据定义语法
在数据定义中,包含以下4类文件:
入口定义文件 数据接口入口,在创建 Mockee 实例时应当传入 见 defs.json
扩展定义文件 用于数据定义的共享 (要注意,不要循环引用) 见 datetime.json
JSON数据枚举文件 用于提供JSON数据格式的枚举,其内容应该是一个数组 见 json.json
一般数据枚举文件 用于提供除 JSON 格式外的其它数据枚举,每行一项 见 choices.txt
{
"GET:/api/test":{
"def":{},
"len":10
}
}
GET:/api/test 数据标识
def 描述返回的字段集合
len 描述返回的数组长度,值为 0 时返回对象
包含 GET:/api/test 的叫做 入口定义文件
表达式
格式:#>(i|f|b|s|j|d|t|dt|ref) exp
当一个值使用 #> 开头,表示这个值应该是一个生成的值(如 "value": "#>i 1-5");否则值为声明的值(如 "type": 2)。
#>i:1-5 叫做 值表达式,用于描述应该如何来生成一个随机的值。
参考
数据类型
#> 后面,紧跟的是数据类型,可用的数据类型描述如下:
i 整数值
f 小数值
b 布尔值
s 字符串
j JSON
d 日期值
t 时间值
dt 日期时间值
ref 引用外部定义文件(实现相同定义的复用)
如果其值为数组,那么在 key 名称后紧跟 [3] 写法,如 iValue[3]。
[3] 表示此值为数组,且其中包含 3 项。
当且仅当值表达式有效
类型后面,应该紧跟一个空白字符。
值描述表达式
再后面,是值描述,其分为两种数据模式,范围和枚举:
范围(随机 生成 值):
当类型为数值时,使用 1-5(包含 1 但不包含 5) 这样的方式指定范围 #>i 1-5 #>f 0.2-0.8
当为日期类型时,使用 20200101-20201231 这样的方式指定范围 #>d 20200101-20201231
当为时间类型时,使用 000000-235959 这样的方式指定范围 #>t 000000-235959
当为日期时间类型时,使用20200101000000-20201231235959 这样的方式指定范围 #>dt 20200101000000-20201231235959
当为字符串时,使用 l(小写字母), L(大写字母), n(数字), s(符号) 组合起来描述 #>s lLns(包含字母,数值和符号) #>s lLn(包含字母,数值)
整数类型
对于类型 i,可以这样写 #>i auto,这表示使用自增长的整数。
此时需要在 options 中传入 i_base 作为自增长的基数(从此数值开始自增),不指定时为 0
原则上只允许出现一次 #>i auto,当出现多次时,其值相同。
时间/日期类型
对于类型 d/t/dt ,有些特殊的写法 #>dt auto->%Y-%m-%d:
可以使用请求的日期区间自动计算日期值,写法为:#>dt auto。
在值表达式后部分,可以使用 ->%Y-%m-%d 的方式指定日期格式化串。其写法遵守 Python 日期格式化 strftime 写法。
枚举值
枚举(随机从给定的值中 选择 值),所有类型使用相同的写法:
#>i (1,2, 4, 6, 8)
也可以从指定的文件加载枚举值(所有类型都支持):
#>s (#choices.txt#)
enum-filename 为枚举文件名,其中每行存放一个数据项,其中不允许出现空行。
无论是范围还是枚举,值不允许出现空白字符
JSON类型
可以使用 #>j json.json 这样的写法来指定从一个 JSON 文件中读取数据项。
j 表示此字段的值是一个JSON结构
json.json 是要读取的文件名。注意:json文件的扩展名必须为 .json
json.json 文件的根必须是数组
此类型仅支持从文件读取。
引用类型
使用写法 #>ref datetime.json 以引入一个外部的数据结构定义。
外部的数据结构定义(datetime.json)与入口定义文件的不同之处在于,其只包含定义部分(值为一个对象),不包含数据长度和入口名称等信息。
参考
其文件名应该是一个相对于 入口定义文件 的路径。
入口定义文件 的 def 项的值,也可以使用此处的引用写法。
定义扩展
扩展是在同级别添加数据项。
单个扩展写法:
{
"#ext#":"ext.json"
}
多个扩展写法:
{
"#ext#":["ext1.json","ext2.json"]
}
如果扩展中包含的项已经存在于当前定义,那么会被忽略(即当前文件的定义优先于扩展文件内的定义)。
参考
引用类型 和 定义扩展 的文件结构是一致的,其差异仅在引入的方式。
TODO
支持设置数据不能重复 ? 结尾表示数据不能重复