本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/113530146
先前分享了第一篇 接口自动化测试框架 【一】,继续来分享。
个人博客:https://blog.csdn.net/zyooooxie
需求
Excel来做用例管理,所以具体咋做呢?
我的想法:
- 必备:url + method + 请求头 | 请求体 + 预期结果
- 非必备:预期结果 支持多种【状态码、某些字段名、某些字段值、字段名:字段值】
- 非必备:请求体的数据 再处理【临时值】
- 非必备:allure生成报告【需要feature、story、title、description】
- 非必备:sql语句【详细、可查到具体结果】
- 非必备:前后置用例【执行顺序:测试数据的创建+清理】
具体实现
为了实现以上需求,实际我把excel的表头设计为:
feature story title url method request_data expected_data remark description setup teardown sql need_setup_teardown
具体含义:
- feature story title description :allure生成报告
- url method request_data expected_data sql【见名知意】
- remark是备注,再处理request_data的
- setup teardown前、后置; need_setup_teardown 是否需要前后置用例、需要哪些前后置用例
读取excel:
class ExcelConfig(object):
@staticmethod
def read_excel(file_absolute_path, sheet_index=None):
if sheet_index is None:
Log.debug('获取全部数据')
book = xlrd.open_workbook(file_absolute_path)
all_sheets = book.sheets()
all_data = [list() for _ in range(len(all_sheets))]
for s in all_sheets:
s_index = all_sheets.index(s)
Log.debug('当前sheet name为{}'.format(s.name))
cur_sheet = book.sheet_by_name(s.name)
data = list()
for h in range(1, cur_sheet.nrows): # 不要表头
ele = cur_sheet.row_values(h)
if ele == [''] * cur_sheet.ncols:
Log.debug('有毛病吧,整行为空')
else:
data.append(ele)
all_data[s_index].extend(data)
else:
Log.debug('获取当前索引的数据'.format(sheet_index))
book = xlrd.open_workbook(file_absolute_path)
need_sheet = book.sheet_by_index(sheet_index)
Log.debug('sheet name为 {}'.format(need_sheet.name))
hang = need_sheet.nrows
all_data = list()
for h in range(1, hang): # 不要表头
ele = need_sheet.row_values(h)
if ele == [''] * need_sheet.ncols:
Log.debug('有毛病吧,整行为空')
else:
all_data.append(ele)
return all_data
excel的method:我把requests发请求的request_type分为【3个post+1个get】json、form、file、get;
excel的request data + remark:
if remark != '': # 修改req_data
new_req_data = CommonFun.change_excel_paramsValue_new(remark, req_data)
else: # 不修改req_data
new_req_data = None if req_data == '' else json.loads(req_data)
@staticmethod
def change_excel_paramsValue_new(remark, request_data):
Log.info('处理前的 request_data: {}'.format(request_data))
params_list = remark.split(',')
if len(params_list) == 1:
assert request_data.find(remark) != -1
r_str = r'\${\w+}'
request_data = CommonFun.change_p_value(p=remark, r_str=r_str, request_data=request_data)
else:
for p in params_list:
assert request_data.find(p) != -1
r_str = r'\${%s}' % p
request_data = CommonFun.change_p_value(p=p, r_str=r_str, request_data=request_data)
Log.info('处理后的 request_data: {}'.format(request_data))
request_data = json.loads(request_data)
return request_data
@staticmethod
def change_p_value(p, r_str, request_data):
if p == 'start':
value = (datetime.date.today() + datetime.timedelta(days=-30)).strftime('%Y-%m-%d')
elif p == 'end':
value = (datetime.date.today() + datetime.timedelta(days=-3)).strftime('%Y-%m-%d')
elif p == 'pS':
value = random.randint(150, 300)
elif p == 'today_date':
value = datetime.date.today().strftime('%Y-%m-%d')
elif p == 'after_date':
value = (datetime.date.today() + datetime.timedelta(days=10)).strftime('%Y-%m-%d')
else:
raise Exception('p:{} 的传参不支持'.format(p))
request_data = re.sub(r_str, '{}'.format(value), request_data, count=1)
return request_data
excel的expected data:
@staticmethod
def change_excel_assertValue(data):
if data == '':
raise Exception('Excel读取的断言内容 不合法')
elif isinstance(data, float) and int(data) in _codes.keys(): # 状态码(200) 实际是200.0
return int(data)
elif isinstance(data, float):
raise Exception('数字,不是状态码,so 格式不对!')
elif data.find(':') != -1: # 字典(key:value)
new_data = '{' + data + '}'
return eval(new_data)
else: # 字符串(内容)
return data # 某些手机号、数字写入excel的时候要添加'
excel的setup teardown:前置、后置用例【此条用例会被忽略】
excel的need_setup_teardown:是否需要前后置【会执行前后置用例】
if isinstance(data_need_s_t, float):
if int(data_need_s_t) == 0:
Log.info('当前用例 不需要前置、后置')
setup_case, teardown_case = list(), list()
else:
raise Exception('前后置 传参不合法')
elif data_need_s_t == '':
Log.info('当前用例 不需要前置、后置')
setup_case, teardown_case = list(), list()
elif isinstance(eval(data_need_s_t), list):
Log.info('当前用例需要前置、后置')
setup_case, teardown_case = eval(data_need_s_t)
else:
raise Exception('前后置 传参不合法')
excel的sql:
if sql == '':
CommonFun.assert_fun(new_res_data, res)
else:
CommonFun().sql_assert_fun(res_data, sql, res, self.db, self.cur)
这部分代码:
- 读取excel的数据【前、后置用例 被忽略】;
- 对每条要执行的用例 处理请求体+断言内容;
- 对每条要执行的用例 配置前后置用例;
这篇就主要这些内容;该系列第三篇 接口自动化框架之 请求方法
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie