Python+Flask写Mock(测试桩)
前言
作为测试,我们在工作中常常会遇到这样的问题
1、我们的系统和多方的系统对接,在测试的时候,我们需要对方系统给我们返回特征性的数据,但是由于各种原因,对方不能够给我们构造出我们想要的目标数据来验证我们的 系统的业务逻辑处理,这个时候怎么办?
2、当前端开发完成,想要转测,但是我们的后端开发代码还未开发完成,怎么办
3、 当我们的环境构造某个场景的数据,比较复杂,需要做很多的基础数据,操作步骤繁琐,但是我们只是想验证其中某一个小功能的改动怎么办?
当然我们的解决方案有一些,比如可以使用fiddler的autoresponse来做到针对特征的请求设置一些返回值,但是这样的不是非常灵活。
既然我们只是想要一个接口的返回特征数据,那么我们去构造这样一个接口,直接跳过其中的复杂业务逻辑处理,直接给到我们要的特征数据即可,我们可以自己编写接口的方式,来直接返回数据即可(当然也可以做动态数据返回,根据参数来设定不同的返回值),所以有了如下的内容
Python篇
环境准备
-
python解析器
-
安装Flask,pip install Flask
-
python编辑器,如PyCharm
模拟请求
在做数据模拟的时候,我们根据请求的方式,以及请求参数的传参形式来进行分开编写,那么常见基于HTTP协议的rest接口有哪些请求方式和数据传参格式呢?请见下表:
请求方式 |
数据格式 |
举例 |
备注 |
GET |
urlPath |
/demo/123 |
参数放在urlPath中,如将123作为参数 |
Params |
/demo?name=zhangsan |
参数在URL的?后,如key是name,值为zhagnsan |
|
POST |
form-data |
name:zhangsan age:18 |
传值使用form表单的形式提交,content-type为multipart/form-data |
raw-json |
{“age”:18,"name":"zhangsan"} |
传值使用json方式,content-type为application/json |
|
|
|
|
模拟GET接口(URLPath)
python代码如下
# coding=utf-8
from flask import Flask, request, json, jsonify
# 实例化Flask类
app = Flask(__name__)
# 在这种方式种,需要在url中,将urlPath中的参数使用<>包起来,并且传值给def 方法,这样就可以在接下来的函数中去使用这个变量了
@app.route('/hello/<name>', methods=['GET'])
def myPath(name):
#处理逻辑略
return name
if __name__ == '__main__':
# 启用服务 debug=True,加上这个参数之后不用重新执行,他会自动执行
app.run(debug=True)
模拟GET接口(Params)
# coding=utf-8
from flask import Flask, request, json, jsonify
# 实例化Flask类
app = Flask(__name__)
@app.route('/hello', methods=['GET'])
def hello():
# 可以通过request.args获取到所有参数键值对
user = request.args
# 也可以单独的去使用key获取值
name = request.args.get("name")
return name
if __name__ == '__main__':
# 启用服务 debug=True,加上这个参数之后不用重新执行,他会自动执行
app.run(debug=True)
模拟POST接口(form表单)
# coding=utf-8
from flask import Flask, request, json, jsonify
# 实例化Flask类
app = Flask(__name__)
@app.route('/post/form', methods=['POST'])
def postForm():
# 可以通过request.form来获取表单值,通过get或者直接通过key来获取参数值
name = request.form.get("name")
age = request.form['age']
date = {"name":name,"age":age}
# 将字典对象序列化,使用json的dumps方法
return json.dumps(date)
if __name__ == '__main__':
# 启用服务 debug=True,加上这个参数之后不用重新执行,他会自动执行
app.run(debug=True)
模拟POST接口(JSON请求方式)
# coding=utf-8
from flask import Flask, request, json, jsonify
# 实例化Flask类
app = Flask(__name__)
@app.route("/post/josn", methods=['POST'])
def postJson():
# 通过request.get_data的方式将值取出,并且通过loads的方式将请求的参数序列化
user = json.loads(request.get_data(as_text=True))
# 从序列化的变量中获取值,当然这边是一层的path,后续根据层级来获取
name = user['name']
age = user['age']
date = {"name": name, "age": age}
# 将字典对象序列化,使用json的dumps方法
return json.dumps(date)
if __name__ == '__main__':
# 启用服务 debug=True,加上这个参数之后不用重新执行,他会自动执行
app.run(debug=True)