借用python的flask库写一个mock实现一个自定义接口服务

mock在接口测试中可以发挥很大的作用,其中之一便是实现自定义接口服务。
python中可以使用flask库实现mock,
写一个简单的登录接口,以及调用,直接上代码:
第一部分:实现登录接口
import json
import flask
import hashlib

from sql_util import SqlUtil


server = flask.Flask(__name__)   # 创建一个服务,把当前这个python文件当做一个服务


@server.route('/login', methods=['get', 'post'])
def login_server():
    """实现一个登录功能的接口,自定义接口响应头、响应body、响应状态码"""
    if flask.request.is_json:
        name = flask.request.json.get('name')  # 获取json请求的参数值name
        password = flask.request.json.get('password')  # 获取json请求的参数值password
        if name in SqlUtil().user() and SqlUtil().user()[name] == password:
            data = {'name': name,
                    'password': hashlib.sha256(password.encode('utf-8')).hexdigest(),
                    'access_token': hashlib.md5('12345678'.encode('utf-8')).hexdigest()
                    }
            res = flask.make_response(json.dumps(data, ensure_ascii=False))  # 构造接口响应体
            res.headers = {'content-length': res.content_length}  # 构造接口响应头
            res.status_code = '200'  # 构造接口状态码
        else:
            data = {'msg': '用户名或密码错误!'}
            res = server.make_response(json.dumps(data, ensure_ascii=False))
            res.status_code = '400'
        return res
    else:
        return json.dumps({"msg": '请传json格式参数!'}, ensure_ascii=False)


if __name__ == '__main__':
    server.run(host='127.0.0.1', port=8888, debug=True)  # 运行服务

第二部分:调用接口

import hashlib
import pytest

from common.request_util import AllRequestMethod as aqm
from common.extract_util import ExtractUtil

@pytest.fixture()
def login(self, request):   # request.param是pytest内request传参固定用法,用于接收传入的值并调用
    method = request.param[0]
    url = request.param[1]
    data = request.param[2]
    res = aqm().request_method(method=method, url=url, json=data)

    return res, data

@pytest.mark.smoke
@pytest.mark.parametrize('login',
                             [("post", "http://127.0.0.1:8888/login", 
                             {'name': 'Millie', 'password': '123456'})],
                             ids=['用户名和密码正确登录成功'],
                             indirect=True)  # 'login'是fixture名称,若多个fixture,使用字符串+逗号隔开的形式,同argnames=的写法
    # [("post", "http://127.0.0.1:8888/login", {'name': 'Millie', 'password': '123456'})同argvalues=的写法
    # ids设置用例名称, indirect=True调用fixture
def test_0_login(self, login):  # excute_sql
    res = login[0]
    data = login[1]
    # 获取access_token
    access_token = res.json().get("access_token")
    # 将access_token写入yaml文件
    ExtractUtil().write_yaml({"access_token": access_token})
    assert res.status_code == 200
    assert res.json().get("name") == data['name']
    assert res.json().get("password") == hashlib.sha256(data['password'].encode('utf-8')).hexdigest()

        

 

 
posted @ 2022-09-30 03:23  菜花小兔  阅读(190)  评论(0编辑  收藏  举报