基于Flask实现的一个简易Mock平台,使用标准json结构体编写Mock Api https://github.com/yinquanwang/MockServer
Key Features
- 遵循Http协议,支持
GET
、POST
、PUT
、DELETE
常用http请求方式 - mock结构体为标准json结构,支持参数内容规则制定以及对象返回信息
- 内置常用校验器,equals、contains、between、length、type, 可灵活自己扩展
- 支持自定义报文Valid与Invalid,返回报文可以是任意类型
- 数据类型丰富,支持string、int、float、list、dict
得益于Flask强大的路由系统,设计核心就是将所有请求的path归一化到一个视图函数处理:
@app.route('/<path:path>', methods=['GET', 'PUT', 'DELETE', 'POST'])
def dispatch_request(path):
"""
mock view logic
:param path: request url for mock server
:return: response msg that use default or custom defined
"""
m = models.Api.query.filter_by(url=request.path, method=request.method).first_or_404()
body = json.loads(m.body)
return domain_server(**body)
@app.errorhandler(404)
def url_not_found(error):
return json.dumps({
"status": 404,
"msg": "the request url not found,please check"
})
如果mock脚本不自定义返回报文,由系统默认提供,默认标准json结构体
VALID = {
"success": True,
"code": "0000",
"msg": "success"
}
INVALID = {
'code': '0020',
'msg': 'request data invalid',
'success': False
}
MISS = {
'code': '0021',
'msg': 'request data missed',
'success': False
}
TYPE_NOT_MATCH = {
"success": False,
"code": "0001",
}
EQUALS = {
"success": False,
"code": "0005",
}
NOT_BETWEEN = {
"success": False,
"code": "0007",
}
STR_NOT_CONTAINS = {
"success": False,
"code": "0004",
}
STR_TOO_LONG = {
"success": False,
"code": "0006",
}
由此我们必须实现一个校验器,对各个字段进行一些基本校验
class Validator:
"""
Validator for mock check
"""
@classmethod
def valid(cls, response=None):
return get_response(response, VALID)
@classmethod
def type_not_match(cls, type, data, response=None):
msg = '{data} must be {type} type'.format(data=data, type=type)
TYPE_NOT_MATCH['msg'] = msg
if type == 'int':
if not isinstance(data, int):
return get_response(response, TYPE_NOT_MATCH)
elif type == 'float':
if not isinstance(data, float):
return get_response(response, TYPE_NOT_MATCH)
elif type == 'string':
if not isinstance(data, str):
return get_response(response, TYPE_NOT_MATCH)
elif type == 'bool':
if not isinstance(data, bool):
return get_response(response, TYPE_NOT_MATCH)
elif type == 'list':
if not isinstance(data, list):
return get_response(response, TYPE_NOT_MATCH)
elif type == 'dict':
if not isinstance(data, dict):
return get_response(response, TYPE_NOT_MATCH)
else:
return False
@classmethod
def is_not_equals(cls, data, expect, response=None):
if data != expect:
msg = '{data} must be equals {expect}'.format(data=data, expect=expect)
EQUALS[