问题:目前公司管理项目工具是Tapd,我们测试用例管理也在上面,Tapd每次只支持一个sheet导入,假如一个excel中存在多个sheet,导入时还是很花费时间,所以写了一个脚本使用接口来导入,当然本质还是一个一个的导入,但是至少解放了双手!
设计思路如下:
代码如下:共两个python文件
1.creatCase.py
1 import openpyxl 2 from openpyxl import Workbook, workbook 3 4 # 读取数据,将原始文件的sheet拆分成一个一个的电子表格文件 5 def copy_file(sorce_file): 6 wb = openpyxl.load_workbook(sorce_file) 7 sheets = wb.sheetnames 8 print(sheets) 9 if not sheets: 10 print('文件为空') 11 else: 12 for sheetname in sheets.__iter__(): 13 if sheetname == '目录': 14 print('存在目录表单,跳过') 15 else: 16 print('复制' + format(sheetname)) 17 copy_sheet(sorce_file, sheetname) 18 19 20 def copy_sheet(sorce_file_path, sheet_name): 21 # 源文件 22 wb1 = openpyxl.load_workbook(sorce_file_path) 23 new_file_path = 'testcase_list\\'+sheet_name + '.xlsx' 24 sheet1 = wb1[sheet_name] 25 wb = Workbook() 26 ws = wb.active 27 max_row = sheet1.max_row # 最大行数 28 max_column = sheet1.max_column # 最大列数 29 30 for m in range(1, max_row + 1): 31 for n in range(97, 97 + max_column): # chr(97)='a' 32 33 n = chr(n) # ASCII字符 34 i = '%s%d' % (n, m) # 单元格编号 35 cell1 = sheet1[i].value 36 ws[i].value = cell1 37 38 wb.save(new_file_path) # 保存数据 39 wb1.close() # 关闭excel 40 wb.close() 41 42 43 if __name__ == '__main__': 44 sorce_file = 'C:/xxx/xxx/xxx/.../xx.xlsx' 45 copy_file(sorce_file)
2.接口操作
uploadCase.py
1 import requests 2 import openpyxl 3 import creatCase 4 5 user_agent = r'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36' \ 6 r' (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36' 7 headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'} 8 9 # 登录tapd 10 def login_fun(login_url,name,pwd,project_id): 11 values = {'data[Login][ref]': 'http://www.tapd.cn/'+project_id+'/sparrow/tcase/tcase_list', 12 'data[Login][encrypt_key]': 'bORItxocKUHkRTlyhYmDMLZGQGtBvBc/GWZKPTdll6s=', 13 'data[Login][encrypt_iv]': '4J11QPi39mXTJtJ0HEqnCA==', 14 'data[Login][site]': 'TAPD', 15 'data[Login][via]': 'encrypt_password', 16 'data[Login][email]': name, 17 'data[Login][password]': pwd, 18 'data[Login][login]': 'login', 19 'dsc_token': '16vSWxWRr85KB5Rn'} 20 21 s= requests.Session() 22 content = s.post(url=login_url, headers=headers, data=values) 23 return s 24 25 # tapd中新增测试用例父目录 26 def creat_parafold(login_url,name,pwd,project_id,paraname): 27 creat_parafold_url = 'https://www.tapd.cn/'+project_id+'/sparrow/tcase_categories/quick_add_category' 28 data1 = {'data[TcaseCategory][parent_id]':'0','data[TcaseCategory][name]':paraname} 29 s=login_fun(login_url,name,pwd,project_id) 30 creat_parare =s.post(url=creat_parafold_url, headers=headers, data=data1) 31 paraid_value = creat_parare.json()['id'] 32 return paraid_value 33 34 # 将excel中的所有sheetname以测试用例子目录形式创建到tapd测试用例父目录下,并在对应目录下上传测试用例 35 def creatFold_importCase(login_url,name,pwd,project_id,casepath,paraname): 36 creatCase.copy_file(casepath) 37 wb = openpyxl.load_workbook(casepath) 38 sheets = wb.sheetnames 39 40 creat_fold_url = 'https://www.tapd.cn/'+project_id+'/sparrow/tcase_categories/quick_add_category' 41 key1 = "data[TcaseCategory][parent_id]" 42 key2 = 'data[TcaseCategory][name]' 43 s = login_fun(login_url, name, pwd, project_id) 44 if paraname: 45 paraid = creat_parafold(login_url,name,pwd,project_id,paraname) 46 print(paraid) 47 else: 48 paraid = 0 49 print(paraid) 50 51 # dict_id = {} 52 for value2 in sheets: 53 value1= {key1: paraid, key2: value2} 54 creat_re = s.post(url=creat_fold_url,headers=headers,data=value1) 55 id_value=creat_re.json()['id'] 56 print(id_value) 57 uploadfile_url = 'https://www.tapd.cn/'+project_id+'/imports/import_tcase' 58 filepath = 'testcase_list/'+value2+'.xlsx' 59 file = { 60 "content": open(filepath, "rb"), 61 "Content-Type": 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 62 "Content-Disposition": "form-data", 63 "filename": value2+'.xlsx'} 64 65 case_data = {'data[tcase][extra_params]': '', 66 'data[tcase][import_type]': 'add', 67 'data[tcase][selected_category_id]': id_value, 68 'data[tcase][Apply]': '下一步', 69 'dsc_token': "16vSWxWRr85KB5Rn"} 70 upload_res = s.post(url=uploadfile_url, headers=headers, files=file, data=case_data, allow_redirects=False) 71 print(upload_res) 72 sure_url=upload_res.headers['Location'] 73 print(sure_url) 74 sure_data = {'data[tcase][selected_category_id]': id_value, 75 'data[tcase][Apply]': '确认导入', 76 'dsc_token': '16vSWxWRr85KB5Rn'} 77 sure_res = s.post(url=sure_url, headers=headers, data=sure_data) 78 print(sure_res) 79 80 81 if __name__ == '__main__': 82 # 进入项目的测试用例页面,点击退出后,再登录时的请求url 83 login_url='xxxx' 84 # 登录账号 85 mobilephone='xxx' 86 # 登录密码,可在登录是请求参数中查看,urlencode形式 87 pwd='xxx' 88 # 导入项目id 89 project_id='xxx' 90 # 测试用例所在目录 91 casepath='C:/xxx/xxx/xxx测试用例.xlsx' 92 # paraname代表创建测试目录的根目录,如果传空,则新增的测试子目录默认创建在【所有的】目录下,如果传一个字符串,则后续测试子目录创建在该目录下 93 paraname="xxx项目V1.0版本" 94 creatFold_importCase(login_url,mobilephone,pwd,project_id,casepath,paraname)
运行结果: