swagger python自动化用例_swagger 自动生成接口测试用例

本文介绍了一个Python脚本,该脚本能够从Swagger JSON URL中抓取接口信息,自动生成接口测试用例。脚本包括了解析接口、处理参数、创建异常用例等功能,并将结果写入Excel和JSON文件。
摘要由CSDN通过智能技术生成

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()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值