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格式的自动化用例

pytest + yaml 框架 -19.根据 swagger.json 自动生成 yaml 格式自动化用例

Swagger接口测试框架-知识集锦

springboot 集成swagger2