- 案例背景
元件效能測試過程中,要匯入大量自定義的資料。
- 案例分析
本案例中採用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:
http://ip/ui/person/save
請求頭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、檔案校驗是非同步過程,上傳檔案介面返回資料不能保證校驗完成,可以等待若干秒後,確認匯入必須在校驗完成後呼叫。