vue + flask实现简易mock平台

简介

这段时间完成了接口自动化测试平台的基本功能。其中的一个模块是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值