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') + '\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 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参数数量是一致的。

各位大大有其他好的方法,欢迎留言一起讨论。

猜你喜欢

转载自www.cnblogs.com/changqing8023/p/9691820.html