- 案例背景
组件性能测试过程中,要导入大量自定义的数据。
- 案例分析
本案例中采用python的pandas库,模拟了生成导入csv文件,模拟在页面点击导入csv,使文件导入更高效。
- 实现方案
1、在前端页面解析内部接口参数
典型的导入流程至少包含上传文件和确认上传。
- 上传文件
在浏览器中打开F12,进入Network,点击文件上传并选择填好的文件,可以采集到请求过程中的参数如下:
内部接口地址Request URL:
http://10.1.1.18/ui/person/import
请求头Request Headers中:
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data;
Cookie: JSESSIONID=B1E48114C18B15DA7064E55D0706AC30; CASTGC=TGT-4-mfFXZJr9k2VPxsbBinEqgOliUqecTeQWNPekXdHPcUEtryXaJ7-cas
请求参数:
organizationId: 1
language: zh_cn
file: (binary)
2、确认上传
待导入文件校验完成后,点击导入,可以采集到确认上传的参数如下:
内部接口地址Request URL:
请求头Request Headers中:
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=UTF-8;
Cookie: JSESSIONID=B1E48114C18B15DA7064E55D0706AC30; CASTGC=TGT-4-mfFXZJr9k2VPxsbBinEqgOliUqecTeQWNPekXdHPcUEtryXaJ7-cas
请求参数:
code: "f82bf0f1-9005-491c-a58b-631d8552f3c8"
flag: 1
orgCode: ""
其中code表示/person/import接口的返回参数校验任务Id
2、用脚本模拟导入过程
文件导入的校验中有数据库的唯一性校验,字段校验,用python脚本可以方便的构造需要格式的csv
1、构造csv
生成随机的身份证号,大概率唯一。
引入pandas计算库,构造DataFrame数据类型,并保证到csv文件中,csv文件需要以gbk格式写入。
def to_csv():
personList=[]
personList.append(["姓名:1~32个字符;不能包含 ' / \: * ? "" < > | 这些特殊字符。"])
for i in range(10001): code=str(random.randint(100000,999999))+str(random.randint(1950,1999))+'0'+str(random.randint(0,9))+'0'\
+str(random.randint(0,9))+str(100000+i)
personList.append(["测试_"+str(i),"1","默认组织","111",code,code,13165867896])
print(personList)
data1 = pd.DataFrame(personList)
path=r'peson.csv'
file=open(path, 'w+', encoding='utf-8')
data1.to_csv(sep=',', encoding='gbk',index=False, header=False,path_or_buf=path)
2、上传文件
前后端交互采用的是接口模式,在Header中加入Cookie即可模拟登录,不会被单点登录拦截。
将上一步生成的csv文件打开,作为/ui/person/import接口的file参数传入,请post方式请求。
def importPersonFromCsv():
global code
url = '=/ui/person/import'
param = ''
user_url = 'http://' + ip + url+param
print(user_url)
# 我们操作文件上传的时候,把目标文件以open打开,PersonImport.csv
files = [('file', ('peson.csv',open('peson.csv', 'rb'),'application/vnd.ms-excel'))]
data = {"organizationId": "1", "language": "zh_cn"}
headers = {'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Cookie': cookie}
r = requests.post(user_url,data,files=files,headers=headers)
print(r.text)
code = r.json().get('data')
print(code)
return code
3、确认导入
待文件上传完成、校验完成后,才能调用确认导入接口,否则会报错。请求头中Content-Type需要为application/json;charset=UTF-8,传入有效cookie,保证不会被拦截。
def saveImportPerson():
url = '/ui/person/'
param = ''
user_url = 'http://' + ip + url+param
print(user_url)
data = json.dumps({"flag": 1,"code": code,"orgCode":""})
headers = {'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/json;charset=UTF-8',
'Cookie': cookie}
r = requests.post(user_url,data=data,headers=headers)
print(r.text)
- 结束语
1、文件校验是异步过程,上传文件接口返回数据不能保证校验完成,可以等待若干秒后,确认导入必须在校验完成后调用。