背景
需要进行商城服饰数据的录入(一个服饰多张图),但是目前系统内接口暂时不支持批量上传图片并获取文件下载路径(需要把文件名和下载地址做对应关系)。此处,使用Apifox完成当前需求,记录一下相关的操作:
1.添加一个前置脚本,查询指定文件夹中所有符合格式的图片数据并输出为list格式;
2.设置一个环境变量,存储所有接口调用已经使用过的文件名,只有获取到的新文件名没有被使用过,才调用文件上传的接口===防止数据重复使用;
3.添加后置脚本,获取接口返回值中文件的下载名称,并与上传使用的文件名一同写入到txt文件中;
4.自动化测试处,添加循环条件,几张图片就循环几次(其实可以再优化,但是不想写了),最终可以获得一个文件名和下载地址对应关系的txt文件。
下面是Apifox的前置脚本内容:
var file_list =[]
//记得先添加环境变量used
used = pm.environment.get("used");
// console.log("used=",used)
if(used == "{{used}}" || used == ""){
var used =[]
}
//正常服饰照片"1" 切图服饰照片others
//正常可不加type,我是为了区分图片类型单独做处理的
var type = '--type='+"1";
// console.log(type)
try {
result = pm.execute("findPict.py",[type]);
file_list = JSON.parse(result.replace(/'/g, '"'))
// console.log("file_list=",file_list)
for (let i = 0; i < file_list.length; i++) {
file_now=file_list[i]
//获取未使用的文件名
if (!used.includes(file_now)){
break
}
}
// console.log("file_now",file_now)
//将本轮使用的文件名写入到used里面去
used.push(file_now)
// console.log("used = ",used)
pm.environment.set("used", used);
//设置临时变量以供接口调用
pm.variables.set("file_now", file_now);
} catch (e) {
console.error(e.message)
}
同时,上传文件的接口,需要处理一下文件的传参(批量修改参数,修改为:true,file,file://{{file_now}},file,)
调用的python脚本内容如下:
import os
import argparse
from glob import glob
def traverse_images (folder_path):
image_formats = ['*.jpg', '*.jpeg', '*.png', '*.gif']
images = []
for image_format in image_formats:
images.extend(glob(os.path.join(folder_path, image_format)))
return(images)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--type', type=str, default=None)
args = parser.parse_args()
#type = 1 正常服饰图片;others:切图服饰图片
if args.type == "1":
folder_path = 'E:\\t_mall_cloth\\uploadEntrance'
images = traverse_images(folder_path)
print(images[:10])
else:
folder_path = 'E:\\t_mall_cloth\\t_fitting_img'
images = traverse_images(folder_path)
print(images[:10])
apifox后置脚本内容如下:
//正常服饰照片"1" 切图服饰照片others
//可忽略这个字段
var type = '--type='+"1";
const file_all = pm.variables.get("file_now");
const result = file_all.match(/[^\\]+$/);
//获取文件名称
const lastSegment = result ? result[0] : null;
console.log(lastSegment)
try {
var jsonData = pm.response.json();
if(jsonData.code==200){
var upload_img = '--uploadImg='+lastSegment+" : "+jsonData.data;
pm.execute("uploadImg.py",[upload_img,type]);
}
else{
console.log(jsonData.data)
}
} catch (e) {
console.error(e.message)
}
调用的python脚本内容如下:
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--uploadImg', type=str, default=None)
parser.add_argument('--type', type=str, default=None)
args = parser.parse_args()
print(f'下载地址:args.uploadImg={args.uploadImg}')
# type = 1 正常服饰图片;others:切图服饰图片
if args.type == "1":
filePath = "E:\\t_mall_cloth\\uploadEntrance\\upload_img.txt"
else:
filePath = "E:\\t_mall_cloth\\t_fitting_img\\upload_img.txt"
with open(filePath,'a') as file:
file.write(args.uploadImg)
file.write('\n')