web接口测试为什么要mock呢
(1)需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。
(2)被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。
前后端项目中,后端接口开发完成之前,接口联调
依赖的上游项目的接口尚未开发完成,需要接口联调测试;
被测单元依赖的对象较难模拟或者构造比较复杂。
这里选择使用python的flask框架进行mock操作,Flask是由python实现的一个web微框架,安装可以通过pip install flask或pycharm安装库的方式。
1.先简要介绍下flask的简单使用
from flask import Flask # 引入Flask类
app = Flask(__name__) # 创建实例并将当前模块名传入
@app.route('/') # 该装饰器的参数是个路由,可以理解为下面的函数将在这个路由中执行
def index():
return 'Hello World'
if __name__ == '__main__':
app.debug = True # 设置调试模式,生产模式的时候要关掉debug
app.run() # 运行
其中前两行都是固定写法,第三行中注意这个路由的意思(我理解就是跟在主页地址后到目标网页的相对路径)最后一行运行也是固定写法
2.Request对象
from flask import Flask,url_for,request,render_template
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
if request.form['user'] == 'admin':
return 'Admin login successfully!'
else:
return 'No such user!'
title = request.args.get('title', 'Default')
return render_template('login.html', title=title)
if __name__ == "__main__":
app.run(debug=True)
request中”method”变量可以获取当前请求的方法,即”GET”, “POST”, “DELETE”, “PUT”等;”form”变量是一个字典,可以获取Post请求表单中的内容,”request.args.get()”方法则可以获取Get请求URL中的参数,该函数的第二个参数是默认值,当URL参数不存在时,则返回默认值。
3.mock数据
直接看代码
# -*- coding:utf-8 -*-
from flask import Flask,request
app = Flask(__name__)
class Datebase():
def __init__(self):
self.address_success = {
"msg": "success",
"code": 0,
"data": {
"data": [
{
"id": "235",
"alias": "123123",
"name": "123213",
"tel": "123213",
"province_name": "北京市",
"city_name": "东城区",
"county_name": "东华门街道",
}
]
}
}
self.address_error = {"msg":"返回失败","code":-400,"data":""}
datebase = Datebase()
@app.route("/useraddress/index", methods=["GET"]) # 地址详情路由
def queryInfo():
address_id = request.args.get("flag")
if int(address_id) == 1:
return datebase.address_success
if int(address_id) == 0:
return datebase.address_error
if __name__ == '__main__':
app.run(port=8080)
在这里先封装了了访问成功和失败的数据,在@app.route中指定路由和请求方式,
request.args.get("flag")获得url中"flag"标签对应的值,后面对该值进行判断,mock出不同返回结果。
网友评论