读取Excel表中的数据
2.提取测试用例
3.发送接口请求
4.接口响应结果
1 import xlrd
2 import ast
3 import json
4 import requests
5
6 def excel_to_list(data_file, sheet):
7 '''
8 一次获取工作表中的所有数据
9 :param data_file: Excel文件名
10 :param sheet: 工作簿名
11 :return: 数据表
12 '''
13 data_list = [] # 新建个空列表,来乘装所有的数据
14 wb = xlrd.open_workbook(data_file) # 打开excel
15 sh = wb.sheet_by_name(sheet) # 获取工作簿
16 header = sh.row_values(0) # 获取标题行数据
17 for i in range(1, sh.nrows): # 跳过标题行,从第二行开始取数据
18 d = dict(zip(header, sh.row_values(i)))# 将标题和每行数据组装成字典
19 data_list.append(d)
20 #logger.info(f"\n全部用例数据:{data_list}\n")
21 return data_list # 列表嵌套字典格式,每个元素是一个字典
22
23 def get_test_data(data_file, sheet, case_name):
24 '''
25 从用例工作簿数据中提取用例数据
26 :param data_list: 工作簿中表中所有用例数据
27 :param case_name: 用例名字
28 :return: 用例数据
29 '''
30 data_list = excel_to_list(data_file, sheet)
31 for case_data in data_list:
32 if case_name == case_data['case_name']: # 如果字典数据中case_name与参数一致
33 #logger.info(f"\nexcel中读取用例数据:\n{case_data}")
34 #logger.info(case_data['headers'])
35 return case_data
36
37 def send_request(case_data, case_name):
38 if not case_data: # 有可能为None
39 # 从字典中取数据,excel中的标题也必须是小写url
40 print("用例数据不存在")
41 url = case_data.get('url') # 从字典中取数据,excel中的标题也必须是小写url
42 data = case_data.get('data') # 注意字符串格式
43 headers = case_data.get('headers')
44 expect_res = case_data.get('expect_res') # 期望数据
45 method = case_data.get('method')
46 if method == "GET":
47 res = requests.get(url=url, data=None, headers=None) # 表单请求,数据转为字典格式
48 res_j = res.json()
49 print(f"用例名称:{case_name}\n"
50 f"请求URL:{url}\n"
51 f"请求数据:{data}\n"
52 f"实际结果:{res_j}\n"
53 f"期望结果:{expect_res}\n")
54 return res
55 else:
56 headers = ast.literal_eval(headers)
57 data = json.dumps(ast.literal_eval(data))
58 res = requests.post(url=url, headers=headers, data=data)
59 res_j = res.json()
60 print(f"用例名称:{case_name}\n"
61 f"请求URL:{url}\n"
62 f"请求数据:{data}\n"
63 f"实际结果:{res_j}\n"
64 f"期望结果:{expect_res}\n")
65 return res
66
67
68 def get_response(data_file, sheet, case_name):
69 case_data = get_test_data(data_file, sheet, case_name)
70 res = send_request(case_data, case_name)
71 return res
72
73 if __name__ == '__main__':
74 data_file = "test_user_data.xls"
75 sheet = "TestUserLogin"
76 get_response(data_file, sheet, "test_getstock_normal")
77 get_response(data_file, sheet, "test_user_login_password")