mock接口数据

网友投稿 1073 2022-05-30

这里是清安,上一章我们讲了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请求,就会报错:

405 Method Not Allowed

Method Not Allowed

The method is not allowed for the requested URL.

所以,也间接性的说明,接口文档还是非常重要的。指定了接口与接口的数据传递。拿不到指定的数据信息,接口不完整,这时候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/", 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/", 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

mock接口数据

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

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

Title 哎呀,你得页面丢失了。

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

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中:

测试

HELLO WORLD

{{name}}

QING-AN

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

from flask import Flask, request, jsonify, redirect, render_template, url_for app = Flask(__name__) @app.route("/name/") def case08(username): return render_template("111.html", name=username) if __name__ == '__main__': app.run(port=7777)

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

Flask

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:uni-app 实现IOS原生APP-本地打包集成极光推送(JG-JPUSH)详细教程
下一篇:【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件
相关文章