importrequestsimportos, jsonfrom common.writeExcel import Write_excel #写入excel模块
from common.logger import Log #打印日志模块
classAnalysisJson:"""swagger自动生成测试用例"""
def __init__(self):
url_json= ‘http://dev.sign.xxbmm.com/v2/api-docs?group=sign-api‘ #json swagger url地址
r =requests.get(url_json).json()
self.data= r[‘paths‘] #paths中的数据是有用的
self.json_path =os.path.abspath(
os.path.dirname(os.path.dirname(__file__))) + ‘\\case_generate‘ + ‘\\data‘ + ‘\\data.json‘ #json file path
self.excel_path =os.path.abspath(
os.path.dirname(os.path.dirname(__file__))) + ‘\\case_generate‘ + ‘\\data‘ + ‘\\demo_api.xlsx‘ #case path
self.interface_params ={}
self.log=Log()
self.row= 2 #写入excel起始行数
self.num = 1 #case id
self.case = {‘1‘: 3, ‘2‘: 5, ‘3‘: 7, ‘4‘: 9} #参数为空,错误的情况 目前可以获取到的参数,最多4个,有9种简单的异常情况
defretrieve_data(self):globalbody_name, methodfor k, v inself.data.items():
method_list=[]for _k, _v inv.items():
interface={}if not _v[‘deprecated‘]: #接口是否被弃用
method_list.append(_k)
api= k #api地址
if len(method_list) > 1: #api地址下的请求方式不止一个的情况
for i inrange(len(method_list)):
body_name= api.replace(‘/‘, ‘_‘) + ‘_‘ * i #json文件对应参数名称,excel中body名称
method = method_list[-1] #请求方式 同一个api地址,不同请求方式
else:
body_name= api.replace(‘/‘, ‘_‘)
method=_k
parameters= _v.get(‘parameters‘) #未解析的参数字典
case_name = _v[‘description‘] #接口名称
tags = _v[‘tags‘][0] #标签名称
if tags != ‘运维工具‘: #去除运维相关接口
params_dict = self.retrieve_params(parameters) #处理接口参数,拼成dict形式
params_list = list(params_dict.keys()) #接口参数存到list中
if params_dict: #单个或多个参数
for i in range(self.case.get(str(len(params_dict)))): #根据接口参数数量,生成异常用例
body_name_all = body_name + str(i) #重新拼接body_name
interface[‘row_num‘] = self.row #写入excel时的所在行
interface[‘id‘] = ‘test_‘ + str(self.num) #case id
interface[‘tags‘] = tags #标签名称
case_name_except = self.case_name(i, case_name, params_list) #异常接口名称
interface[‘name‘] = case_name_except #case中文描述
_type = ‘json‘ #参数获取方式
interface[‘method‘] = method #请求方式
interface[‘url‘] = ‘http://dev.sign.xxbmm.com‘ + api #拼接完成接口url
interface[‘headers‘] = ‘yes‘ #是否传header
interface[‘body‘] =body_name_all
interface[‘type‘] =_type
self.num+= 1self.row+= 1self.interface_params[body_name_all]= params_dict #参数拼成dict
self.write_excel(interface, self.excel_path) #参数写入excel
else: #不传参数
_type = ‘data‘interface[‘name‘] =case_name
interface[‘row_num‘] =self.row
interface[‘id‘] = ‘test_‘ +str(self.num)
interface[‘tags‘] =tags
interface[‘method‘] =method
interface[‘url‘] = ‘http://dev.sign.xxbmm.com‘ +api
interface[‘headers‘] = ‘yes‘interface[‘body‘] =body_name
interface[‘type‘] =_type
self.num+= 1self.row+= 1self.interface_params[body_name]=params_dict
self.write_excel(interface, self.excel_path)
self.write_params(self.interface_params)#参数写入json文件
defretrieve_params(self, parameters):"""处理参数"""params= ‘‘_in= ‘‘
for each inparameters:
_in+= each.get(‘in‘) + ‘\n‘ #参数传递位置
params += each.get(‘name‘) + ‘\n‘ #参数
_in = _in.strip(‘\n‘)
_in_list= _in.split(‘\n‘)
params= params.strip(‘\n‘)
params_list= params.split(‘\n‘)
del_list=params_list.copy()for i inrange(len(_in_list)):if _in_list[i] == ‘header‘:
params_list.remove(del_list[i])#只保存在body传的参数
test_list =params_list.copy()
params_dict= dict(zip(params_list, test_list)) #把list转为dict
returnparams_dictdefwrite_params(self, res):"""把处理后的参数写入json文件"""
ifisinstance(res, dict):
with open(self.json_path,‘w‘, encoding=‘utf-8‘) as f:
json.dump(res, f, indent=4)
self.log.info(‘Interface Params Total:{} ,write to json file successfully!‘.format(len(res)))else:
self.log.info(‘{} Params is not dict.‘.format(self.write_params.__name__))defwrite_excel(self, interface, filename):
wt=Write_excel(filename)try:
wt.write(interface[‘row_num‘], 1, interface[‘id‘])
wt.write(interface[‘row_num‘], 2, interface[‘tags‘])
wt.write(interface[‘row_num‘], 3, interface[‘name‘])
wt.write(interface[‘row_num‘], 4, interface[‘method‘])
wt.write(interface[‘row_num‘], 5, interface[‘url‘])
wt.write(interface[‘row_num‘], 7, interface[‘headers‘])
wt.write(interface[‘row_num‘], 8, interface[‘body‘])
wt.write(interface[‘row_num‘], 9, interface[‘type‘])
self.log.info(‘Interface case id {},write to excel file successfully!‘.format(interface[‘id‘]))exceptException as e:
self.log.info(‘Failure of interface use case to write to excel file! error:{}‘.format(e))return
defcase_name(self, i, case_name, params_list):"""使case更加易读,给异常用例补全名称"""
globalcase_name_exceptif i ==0:
case_name_except= case_name + ‘-正常传参‘
if i == 1:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[0] + ‘为空‘
if i == 2:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[0] + ‘错误‘
if i > 2:if i == 3:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[1] + ‘为空‘
if i == 4:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[1] + ‘错误‘
if i > 4:if i == 5:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[2] + ‘为空‘
if i == 6:
case_name_except=case_name
case_name_except= case_name_except + ‘-‘ + params_list[2] + ‘错误‘
returncase_name_exceptif __name__ == ‘__main__‘:
AnalysisJson().retrieve_data()