简介
这段时间完成了接口自动化测试平台的基本功能。其中的一个模块是mock平台,实现了简单的mock功能以及mock数据的管理。
目前mock服务未对入参进行校验。
技术栈:vue + python falsk
数据库:mongodb
功能实现
mock 服务
利用flask的路由功能将mock请求统一路由到一个视图函数上。
mock的数据保存在数据库中,根据path和method查询到对应mock数据的响应头、响应体和HTTP状态码返回
@mock_api.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def mock(path):
methodData = {
'GET': '1',
'POST': '2',
'PUT': '3',
'DELETE': '4',
}
mocks = mongo.db.mock.find(
{
'url': '/mock/' + path,
'method': methodData[request.method],
'delete_time': None
},
{"_id": 0}).sort([('_id', -1)])
mocks = list(mocks)
# mock数据不存在 返回405
if not mocks:
raise MethodMockException()
response_body = json.loads(mocks[0]['response_body']) if mocks[0]['response_body'] else ''
status_code = mocks[0]['status_code']
response_header = json.loads(mocks[0]['response_header']) if mocks[0]['response_header'] else ''
return response_body, status_code, response_header
mock 数据管理
mock数据的管理就是对mongodb数据库进行增删改查操作(以下代码为模型层)
Mock类
class Mock:
def __init__(self, method=None, url=None, request_header=None, request_body=None, response_header=None,
response_body=None, status_code=None, msg=None):
self.mid = int(round(time.time() * 1000))
self.method = method
self.url = url
self.request_header = request_header
self.request_body = request_body
self.response_header = response_header
self.response_body = response_body
self.status_code = status_code
self.msg = msg
self.delete_time = None
新增mock数据
将请求方法、请求地址、请求头、请求体、响应体、响应头、状态码、描述等信息保存。
def new_mock(self):
search_by_url = mongo.db.mock.find(
{
'url': '/mock' + self.url,
'method': self.method,
'delete_time': None
},
{"_id": 0}).sort([('_id', -1)]).limit(1)
count = search_by_url.count()
# 存在url相同的数据,不允许新增
if count >= 1:
raise AddMockException(msg='已存在同名的url')
mock = {
'mid': self.mid,
'method': self.method,
'url': '/mock' + self.url,
'request_header': self.request_header,
'request_body': self.request_body,
'response_header': self.response_header,
'response_body': self.response_body,
'status_code': self.status_code,
'msg': self.msg,
'delete_time': self.delete_time,
}
mongo.db.mock.insert(mock)
修改mock数据
def edit_mock(self):
old_mock = self.search_mock(self.mid, None)
if not old_mock:
raise EditMockException(msg='mock接口不存在')
if not (old_mock[0]['url'] == self.url and old_mock[0]['method'] == self.method):
search_by_url = mongo.db.mock.find(
{
'url': self.url,
'method': self.method,
'delete_time': None
},
{"_id": 0}).sort([('_id', -1)]).limit(1)
count = search_by_url.count()
# 存在url相同的数据,不允许修改
if count >= 1:
raise EditMockException(msg='已存在同名的url')
mocks = mongo.db.mock.update_one(
{'mid': int(self.mid)},
{
'$set': {
'method': self.method,
'url': self.url,
'request_header': self.request_header,
'request_body': self.request_body,
'response_header': self.response_header,
'response_body': self.response_body,
'status_code': self.status_code,
'msg': self.msg,
}
}
)
return mocks.modified_count
删除mock数据
def delete_mock(self):
old_mock = self.search_mock(self.mid, None)
if not old_mock:
raise EditMockException(msg='mock接口不存在')
mocks = mongo.db.mock.update_one(
{'mid': int(self.mid)},
{'$set': {'delete_time': int(round(time.time() * 1000))}}
)
return mocks.modified_count
查询mock数据
@classmethod
def search_mock(cls, mid, url):
mocks = mongo.db.mock.find(
{
'mid': int(mid) if mid is not None else {'$type': 18},
'url': {'$regex': url} if url is not None else {'$regex': ''},
'delete_time': None
},
{"_id": 0}).sort([('_id', -1)])
mocks = list(mocks)
return mocks