mock接口数据

举报
清安无别事 发表于 2022/01/18 09:34:17 2022/01/18
【摘要】 ​         这里是清安,上一章我们讲了requests请求以及unittest封装,文中提及了mock,以及还有一份写的mock--py文件。本章就来讲讲,如何mock接口数据。        首先我们先了解一下mock的作用以及flask框架。什么是mock?        mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对上级模块的测试。...

 

        这里是清安,上一章我们讲了requests请求以及unittest封装,文中提及了mock,以及还有一份写的mock--py文件。本章就来讲讲,如何mock接口数据。

        首先我们先了解一下mock的作用以及flask框架。

什么是mock?

        mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对上级模块的测试。mock也分为两种:前端对接口的mock,后端单元测试中涉及的mock。

        如果一个接口A返回的数据需要依赖于另一个接口B,当开发中B接口还未开发完全时候这里会需要用到Mock。

mock的作用?

        1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接 口或其他模块, 那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以使用mock模拟被 依赖接口,完成目标接口的测试

        2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试

        3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复 杂的接口业务, 那么我们完全可以使用mock来模拟这个复杂的业务接口,其实这个和解决接口依赖是一样的原理

        4. 前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同 的页面,那么 你就需要调用后台的接口,但是后台接口还未开发完成,是不是你就停止这部分工作呢?答案是否定的,你完全可 以借助mock来模拟后台这个接口返回你想要的数据

mock的使用

        上面的术语套用完毕,我们直接看代码一步步解析吧,这样才能看得懂一些。

#安装:pip install flask 
from flask import Flask 
#固定格式 
app = Flask(__name__) 
#路由 
@app.route("/anan/come") 
def hello(): 
    return "Hello Flask!" 
if __name__ == "__main__": 
#启动服务 
    app.run()

        解析:app.run()里面可以指定端口号,后续会讲,路由中可以指定请求接口类型是get还是post以及其他。

        我们用国货之光ApiPost请求看看:

GET请求

        我们指定请求方式以及端口号:

@app.route("/anan/book", methods=['GET'])
def queryInfo1():
    my_flag = request.args.get("flag")
    data = {"code": "0", "msg": "接口请求成功"}
    data1 = {"code": "-1", "msg": "接口请求失败"}
    if int(my_flag) == 0:
        return data
    elif int(my_flag) == 1:
        return data1

if __name__ == '__main__':
    app.run(port=7777)

         如果这里指定了Get你用了post请求,就会报错:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

        所以,也间接性的说明,接口文档还是非常重要的。指定了接口与接口的数据传递。拿不到指定的数据信息,接口不完整,这时候mock数据也是很重要的。

POST请求

        看看下面的POST请求:

from flask import Flask, request, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/book1", methods=["POST"])
def case02():
    data = request.form.get("flags")
    print(data)
    # jmeter发起请求
    return {"code": 200, "msg": "success"}

@app.route("/anan/book2", methods=["GET"])
def case01():
    flag = request.args.get("flag")
    print(flag)
    # http://127.0.0.1:8080/app/case01?flag=qingan
    return "GET请求完成"

if __name__ == '__main__':
    app.run(port=7777)

        这里我们可以传参进来但是,却不能像get请求一样,可以在控制台看到返回值。

         这也是两者的区别,也是体现了get与post的区别,get与post的区别各位就自行百度吧,还是很多这类回答的。

转换

        <>表示转换,可加path可不加,如果加了path,那么qing/an这个路由就会原样输出,那么如果不加转换则会输出报错,我们来看看。

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/case03/<path:username>", methods=["GET"])
def case03(username):
    print(type(username))
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

        这里打印了类型,可以在控制台看到是什么类型的,类型也是可以转变的,path改成int或者float输出的就是对应的类型。我们用ApiPost请求看看吧:

         然后我们看看不写<>中的path吧。

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/case03/<username>", methods=["GET"])
def case03(username):
    print(type(username))
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

         看,找不到页面了吧,这里可能你们显示的不是这个,因为我写了一个报错界面,后续也会讲到。

重定向

        以上述为例,我们在最后加上/就会造成重定向,重定向的状态码有哪些了解吗?像300,301等等都是,看下面的这个例子:

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/case04", methods=["POST"])
def case04():
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

        这里是可以正常访问的,那么我们在后面加上一个/呢:

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/case04/", methods=["POST"])
def case04():
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

         我们遇到这种情况其实在请求后面加上/也是可以正常访问的,那么重定向还有什么用处呢?

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/")
def case06():
    return redirect(url_for("case07"))

@app.route("/hello")
def case07():
    print("qingan")
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

        这里我请求case06实际是可以得到case07的返回值的,请求方式默认GET。

         那么有人就会想上述的POST请求能不能也可以重定向到case07来呢,响应得到case07的结果,试试就知道了

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/anan/case04/", methods=["POST"])
def case04():
    with app.test_request_context('/app/case04', method='POST'):
    # return {"code": 200, "msg": "success"}
    return redirect(url_for("case07"))

@app.route("/")
def case06():
    return redirect(url_for("case07"))

@app.route("/hello")
def case07():
    print("qingan")
    return {"code": 200, "msg": "success"}

if __name__ == '__main__':
    app.run(port=7777)

         302:指示已经将资源暂时地移动到了另一个位置,但将来的引用仍应使用原来的 URI 访问该资源。 保留此定义是为了向后兼容。

        但是如果将POST换成GET,就可以访问成功的哟,这跟这两者的机制有关。

HTML

        前面展示了一个报错是提示:哎呀,你得页面丢失了。这是一个HTML界面,这里就来说说用法。

         在你的文件中需要存在一个这也的文件夹用于存放html5文件,然后我们可以在文件中写一些HTML5语法,比如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <h>哎呀,你得页面丢失了。</h>
</head>
<body>

</body>
</html>

        或者你也可以插入一图进去。用于提示页面不存在。

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.errorhandler(404)
def case09(erro):
    return render_template("er_ro.html"),404

if __name__ == '__main__':
    app.run(port=7777)

        启动服务后随便访问一个不存在的界面就能看到这个提示了:

         当然我们还能通过路由进行传值到HTML中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
    <h1>HELLO WORLD</h1>
    <h1>{{name}}</h1>
    <h1>QING-AN</h1>
</head>
<body>

</body>
</html>

        这里可以看到有一个{{name}},这个是用于接收值的,各位可以了解了解HTML传值的写法,也是可以在HTML中执行访问的方法,需要写一个form用于接收请求类型的方法。这里的话我们直接用Flask写,做一个了解。

from flask import Flask, request, jsonify, redirect, render_template, url_for

app = Flask(__name__)

@app.route("/name/<username>")
def case08(username):
    return render_template("111.html", name=username)

if __name__ == '__main__':
    app.run(port=7777)

         这里我点的是预览,不然看到的就是返回的HTML代码,各位也可以在浏览器中访问,因为是GET请求,如果是POST请求就只能通过postman,jmeter,ApiPost工具进行访问。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。