大家好,我是好学的小师弟,今天来和大家分享下,近期工作中用postman和python的flask框架写的一个脚本。
目录
代码流程
postman的预请求对flask发送一个url,进行传参。python flask通过路由匹配,提取相应的参数值,该参数值就是我们想要的存在本地上的图片地址,python得到图片本地地址,接着找到他并对它进行编码,然后给postman返回一个base64编码后的图片字符串,然后postman将该返回值作为一个变量值,发送到我们的body请求体中,完成一次完整的请求发送。并获得预期响应结果。
本文涉及到的相关内容基础知识介绍
1.postman入门简介
【接口测试—postman】5分钟让你学会接口测试工具——postman的基础常用技巧,看完少走一周时间的弯路【建议收藏】
2.py文件如何生成exe文件
【python之pyinstaller】如何将.py文件生成.exe文件
近期在做路口抓拍车辆违规的算法接口测试,由于测试图片量大,对于web测试页面显示有问题的图片,如果再一次次的去手动对他们进行base64,然后在用算法接口对他们进行验证,看看是算法原生接口有问题还是我们调用算法的接口写的有问题。这样做的话,工程量就很大。所以我就尝试着写一个脚本,每次只要更改下postman里面的预请求图片地址,即可获得相对应的响应
随笔吐槽:写到这,我突然自闭了,我完全可以都用python写啊【事实上我还真把它写完了,只不过那个脚本做了两个功能,一时间没有想到这上面来】,还用啥postman调用flask返回接口。。。算了,写都写了,就当熟悉postman了(笑哭)
步骤
postman发预请求,url参数中含有图片地址——flask从url中提取到图片地址——对图片进行base64的编码——函数将编码后的结果返还给postman——postman将值存到一个变量中——该变量即是请求body中的一个参数值——接口请求构造完整——返回预期响应
1.postman预请求
因为接口请求body中有个参数,需要预请求提前请求另一个网址把这个变量值返回过来,这样才能构造一个完整的接口请求。
postman预请求代码
//postman预请求代码
//想要测试的图片保存在主机上的地址
image_path = "C:\\Users\\***\\Desktop\\2021-10-09*****\\一图多目标\\苏D3678Q_苏D36H26.png"
//对下面这个网址发起请求,url自己编写,只要和flask上对应起来就行。
//调用方法这里用的是get,因为方便,参数就在网址上显示出来,后面python直接读取网址上的参数就行了
pm.sendRequest("http://127.0.0.1:1234/image_base64?image_path=" + image_path, function (err, res) {
//这里的网址用的是拼接的方式,问号前面是url,后面是键值对的方式传参
//127.0.0.1就是访问主机,端口号自己定义(与flask中相匹配)
if (err) {
console.log(err); // 如果响应出错,打印错误信息
pm.environment.set("ImageBase64", ""); //设置一个ImageBase64变量 值为空
} else {
pm.environment.set("ImageBase64", res.text());//设置一个ImageBase64变量 值为flask返回的响应
}
});
postman请求body
2.flask网页接口的编写
通过对postman发起的请求,flask匹配到相应的路由,并返回对应的结果给到postman中
import base64
import os
from flask import Flask, request
app = Flask(__name__)
#查询请求url中是否有/image_base64,请求方法为get
@app.route('/image_base64', methods=['GET'])
def on_get_image_base64():
image_path = ""
try:
#request.args.get 这个get请求获取的是前端传来的url参数中
#是否含有id等于image_path的这个参数的值
image_path = request.args.get("image_path")
if os.path.isfile(image_path):
#查看本地路径中是否有这张图片,有的话,就二进制打开文件,
#并对他进行base64编码,然后返回值
with open(image_path, mode='rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
else:
error_msg = "{}: not exists!".format(image_path)
except Exception as e:
error_msg = "{}: {}".format(image_path, repr(e))
#没有 返回空
return error_msg
if __name__ == '__main__':
#规定下地址和端口,host='0.0.0.0' 本机所有ip都能访问
#flask默认的是http://127.0.0.1:5000/ 但是这个地址外部不能访问到,所以要把host设置下
app.run(host='0.0.0.0', port='1234')
3.结果演示
预请求和请求body都写完后,flask也把他run起来,然后点击postman中的send,然后点击右上方的小眼睛,即可看到下图,可以看到,在该测试运行环境中,确实输入了这么一个变量和变量值。
返回结果
这里我写了两个test,一个用来测算法原生接口返回的值,一个测自己开发人员写的调用接口返回来的值。通过对比,定位问题原因。
4.有可能存在的问题
1.flask打开,显示的网址端口还是5000,没有显示自己设置好的端口
2021.10.23更新
5.纯python代码
python写的这个就是一个纯粹的接口测试,发送请求,获取响应了。。。。。
每次改改,图片地址就完事了。。。
import base64
import requests
from pprint import pprint
image_path=r'C:\Users\***\Desktop\2021-10-09***三种需求\一图多目标\苏D5089X_苏D657G2.png'
qst_url='http://10.45.***.126:****/images/recog'
def base64_api(image_path):
picture_path=image_path
with open(picture_path,'rb')as f:
'''
这边只想对文件进行读操作
'''
picture_base64 = base64.b64encode(f.read())
return picture_base64
params={
"Output": {
"SubClass": 1
},
"Model": 5,
"ImageList": [
{
"ImageID": "1",
"Data":base64_api(image_path)
}
]
}
res=requests.post(url=qst_url,json=params)
response=eval(res.text)
pprint(response)
新人创作不易,觉得不错的看官,点个赞吧,么么哒!!!
转载注明出处!