swagger 自动生成接口测试用例
Posted changqing8023
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swagger 自动生成接口测试用例相关的知识,希望对你有一定的参考价值。
import requests import os, json from common.writeExcel import Write_excel # 写入excel模块 from common.logger import Log # 打印日志模块 class AnalysisJson: """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种简单的异常情况 def retrieve_data(self): global body_name, method for k, v in self.data.items(): method_list = [] for _k, _v in v.items(): interface = {} if not _v[‘deprecated‘]: # 接口是否被弃用 method_list.append(_k) api = k # api地址 if len(method_list) > 1: # api地址下的请求方式不止一个的情况 for i in range(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 += 1 self.row += 1 self.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 += 1 self.row += 1 self.interface_params[body_name] = params_dict self.write_excel(interface, self.excel_path) self.write_params(self.interface_params) # 参数写入json文件 def retrieve_params(self, parameters): """处理参数""" params = ‘‘ _in = ‘‘ for each in parameters: _in += each.get(‘in‘) + ‘ ‘ # 参数传递位置 params += each.get(‘name‘) + ‘ ‘ # 参数 _in = _in.strip(‘ ‘) _in_list = _in.split(‘ ‘) params = params.strip(‘ ‘) params_list = params.split(‘ ‘) del_list = params_list.copy() for i in range(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 return params_dict def write_params(self, res): """把处理后的参数写入json文件""" if isinstance(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__)) def write_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‘])) except Exception as e: self.log.info(‘Failure of interface use case to write to excel file! error:{}‘.format(e)) return def case_name(self, i, case_name, params_list): """使case更加易读,给异常用例补全名称""" global case_name_except if 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] + ‘错误‘ return case_name_except if __name__ == ‘__main__‘: AnalysisJson().retrieve_data()
执行成功后自动生成的 case,因为我使用的是ddt+requests+unittest框架,所以要把case集成到excel中。断言什么的需要手动输入...
data.json文件。使用的参数值需要手动输入...
生成的日志文件。从日志文件可以看出,case条数和对应的json参数数量是一致的。
各位大大有其他好的方法,欢迎留言一起讨论。
以上是关于swagger 自动生成接口测试用例的主要内容,如果未能解决你的问题,请参考以下文章
python实现处理swagger接口文档,转换为yaml格式的自动化用例
python实现处理swagger接口文档,转换为yaml格式的自动化用例
python实现处理swagger接口文档,转换为yaml格式的自动化用例