MockServer模拟服务返回(mocp和Flask)

一、mock概述

Mock 俗称 挡板 ,在测试过程中,对于某些不容易获取的数据,用一个虚拟的对象来返回期望的数据,从而模拟了特定的测试场景;Mock可以作用于客户端,也可以作用于服务端

二、实现mock的几种手段

1、让开发在代码中进行固定返回指定数据

2、使用工具模拟返回数据 如:Fiddler

3、使用Python编写一个API接口 如:Flask

4、使用开源的MockServer:mocp

三、开源的MockServer工具:mocp

3.1 mocp是什么?

3.2 下载jar包

github地址:https://github.com/dreamhead/moco

下翻找到Download

下载完成是jar包

3.3 使用步骤

Moco文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

1、配置好java环境,也就是jdk

2、执行命令:java -jar moco-runner-<version>-standalone.jar http -p 12306 -c foo.json

              或:java -jar moco-runner-1.0.0-standalone.jar 协议类型 -p 端口号 -c 配置文件

启动效果

3.4 接口配置&GET请求(无参数)

创建一个foo1.json文件,然后增加以下request&response内容

[
    {
      "description": "注释字段:这是一个get请求",
      "request": {
        "uri":"/foo1/get"
      },
      "response": {
        "text":"这是第一个demo",
        "headers":{
          "Content-Type":"text/html;charset=gbk"
        }
      }
    }
]

注意:

moco模拟请求返回中文乱码问题,添加响应头编码格式为gbk或utf-8,就可以解决返回结果中文乱码

访问:

3.5 接口配置&GET请求(有参数)

同样需要先创建一个json文件,当让多种请求方式可以使用同一个文件

{
  "description": "这是一个带参数的post请求",
  "request": {
    "uri": "/postWithParam",
    "method": "post",
    "forms": {
      "name": "Tom",
      "sex": "man"
    }
  },
  "response": {
    "code":200
    "text": "请求成功!",
    "headers":{
      "Content-Type":"text/html;charset=utf-8"
    }
  }
}

访问:127.0.0.1:9090/foo1/get?name=Tom&id=1

3.5 接口配置&POST请求

[
  {
    "description": "这是一个带参数的Get请求的Demo",
    "request": {
      "uri": "/foo1/post",
      "method": "post",
      "forms": {
        "name": "Tom",
        "id": "1"
      }
    },
    "response": {
      "text": "我张三会来了",
      "headers":{
        "Content-Type":"text/html;charset=utf-8"
      }
    }
  }
]

使用postman请求

3.7 返回值为Json格式的请求

[
  {
    "description": "这是一个带参数的Get请求的Demo",
    "request": {
      "uri": "/foo1/json",
      "method": "post",
      "forms": {
        "type": "1"
      }
    },
    "response": {
      "json": {
        "code": "200",
        "msg": "susses",
        "data": {
          "id":"1111111",
          "phone":"苹果手机"
        }
      },
      "headers":{
        "Content-Type":"text/html;charset=utf-8"
      }
    }
  }
]

访问:http://localhost:9090/foo1/json

3.8 Json配置文件请求类型汇总

[
  {
    "description": "这是一个带参数的get请求",
    "request": {
      "uri": "/foo1/get",
      "method": "get",
      "queries": {
        "name": "Tom",
        "id": "1"
      }
    },
    "response": {
      "text": "请求成功",
      "headers":{
        "Content-Type":"text/html;charset=utf-8"
      }
    }
  },
  {
    "description": "这是一个post请求",
    "request": {
      "uri": "/foo1/post",
      "method": "post",
      "forms": {
        "name": "Tom",
        "id": "1"
      }
    },
    "response": {
      "text": "请求成功",
      "headers":{
        "Content-Type":"text/html;charset=utf-8"
      }
    }
  },
  {
    "description": "返回json类型数据",
    "request": {
      "uri": "/foo1/json",
      "method": "post",
      "forms": {
        "type": "1"
      }
    },
    "response": {
      "json": {
        "code": "200",
        "msg": "susses",
        "data": {
          "id":"1111111",
          "phone":"苹果手机"
        }
      },
      "headers":{
        "Content-Type":"text/html;charset=utf-8"
      }
    }
  }
  
]

四、使用Python的Flask编写接口

4.1 创建一个Flask项目

创建一个项目,叫 flaskmock ,创建一个文件叫 mock_server.py ,写上如下代码:
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


if __name__ == '__main__':
    app.run(debug=True)

4.2 编写接口

1、没有参数的get请求
@app.route('/get')
def request_get():
    return 'ok'

重启服务,访问:http://127.0.0.1:5000/get

2、有参数的get请求
#http://127.0.0.1:5000/get/params
@app.route('/get/params')
def get_params():
    id = request.args.get("id")
    value = request.args.get("value")
    return f"id:{id},value{value}"

3、参数为表单类型的post请求
# http://127.0.0.1:5000/post/form
@app.route('/post/form',methods=['POST']) # methods定义了请求方式
def post_form():
    username = request.form.get('username') # 获取表单参数username
    password = request.form.get('password') # 获取表单参数password

    return f'欢迎{username},密码是:{password}'

4、参数为json类型的post请求
# http://127.0.0.1:5000/post/json
@app.route('/post/json', methods=['POST'])  # methods定义了请求方式
def post_json():
    #传参形式
    # {
    #     "username": "shamo",
    #     "password": "123456"
    # }
    username = request.json['username']  # 获取json参数的username
    password = request.json['password']  # 获取json参数的password
    # 返回json形式的数据
    res_json = {
        'status': 0, 'message': 'success',
        'username': username,
        'password': password}
    return res_json

启动服务,使用postman请求http://127.0.0.1:5000/post/json 写上json参数  

5、有路径参数的put或者delete请求
# http://127.0.0.1:5000/put/10/change
@app.route('/put/<id>/change', methods=['PUT'])  # <id>表示路径参数id
def change_data(id):  # id参数名称必须和路径里的<>中的一样
    return f'{id}数据修改成功'


#http://127.0.0.1:5000/delete/10
@app.route('/delete/<id>', methods=['DELETE'])  # <id>表示路径参数id
def delete_data(id):  # id参数名称必须和路径里的<>中的一样
    return f'{id}数据删除成功'

访问:http://127.0.0.1:5000/delete/10

6、设置返回异常状态码
@app.route('/return/statuscode',methods=['POST'])
def return_statuscode():
    response = make_response() # 造一个响应对象
    response.status_code = 500 # 设置响应状态码
    
    return response #返回响应对象
7、全部接口汇总文件
from flask import Flask, request, make_response

app = Flask(__name__)


@app.route('/get')
def request_get():
    return 'ok'


# http://127.0.0.1:5000/get/params
@app.route('/get/params')
def get_params():
    id = request.args.get("id")
    value = request.args.get("value")
    return f"id:{id},value{value}"


# http://127.0.0.1:5000/post/form
@app.route('/post/form', methods=['POST'])  # methods定义了请求方式
def post_form():
    username = request.form.get('username')  # 获取表单参数username
    password = request.form.get('password')  # 获取表单参数password
    return f'欢迎{username},密码是:{password}'


# http://127.0.0.1:5000/post/json
@app.route('/post/json', methods=['POST'])  # methods定义了请求方式
def post_json():
    # 传参形式
    # {
    #     "username": "shamo",
    #     "password": "123456"
    # }
    username = request.json['username']  # 获取json参数的username
    password = request.json['password']  # 获取json参数的password
    # 返回json形式的数据
    res_json = {
        'status': 0, 'message': 'success',
        'username': username,
        'password': password}
    return res_json

# http://127.0.0.1:5000/put/10/change
@app.route('/put/<id>/change', methods=['PUT'])  # <id>表示路径参数id
def change_data(id):  # id参数名称必须和路径里的<>中的一样
    return f'{id}数据修改成功'


#http://127.0.0.1:5000/delete/10
@app.route('/delete/<id>', methods=['DELETE'])  # <id>表示路径参数id
def delete_data(id):  # id参数名称必须和路径里的<>中的一样
    return f'{id}数据删除成功'

@app.route('/return/statuscode',methods=['POST'])
def return_statuscode():
    response = make_response() # 造一个响应对象
    response.status_code = 500 # 设置响应状态码

    return response #返回响应对象



if __name__ == '__main__':
    app.run(debug=True)

五、mock文件获取 

网盘链接:

https://www.123pan.com/s/UmBBTd-aJsH.html?提取码:dU60

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值