【测试工具】swagger接口比对工具

      项目中,开发人员会使用swagger来进行接口管理,并给到测试人员进行接口用例编写,但是由于项目涉及到多个服务的时候,项目人员较多的情况下,不能保证每个开发人员会将接口的改动通知到测试人员,此时需要对接口的变动进行监控,及时发现接口的变动,从而做好影响范围的分析以及回归范围的界定。

import json

newFilePath = r"C:\Users\DLZ\Desktop\newApi211.json"
oldFilePath = r"C:\Users\DLZ\Desktop\oldApi241.json"

def readJsonFile(filePath):  #获取到仅是接口的json数据
    file = open(filePath, "rb")
    fileJson = json.load(file)
    # 获取paths值,即接口定义信息
    interfaces = fileJson['paths']
    bodys = fileJson['definitions']
    # print(apis)
    return interfaces, bodys



# 将接口字典中的key转成list
def get_keys(dict):
    keyList = []
    for key in dict.keys():
        keyList.append(key)
    # 获取到的接口uri地址,去重的(如果一个接口有两种请求方式,只显示一个接口名称)
    # print(keyList)
    return keyList

# 找出变动的接口
def checkAPIs( ):
    new_interface_infos, new_bodys = readJsonFile(newFilePath)
    old_interface_infos, old_bodys = readJsonFile(oldFilePath)

    new_interface_names = get_keys(new_interface_infos)
    old_interface_names = get_keys(old_interface_infos)

    new_body_names = get_keys(new_bodys)
    old_body_names = get_keys(old_bodys)


    resFile = open("./result.txt", 'w')

    same_interface_names = []  # 存放接口中共有的url
    same_bodys = []
    # 1.找出新增的接口 2.收集相同接口的url
    for i in range(0, len(new_interface_names)):
        if new_interface_names[i] not in old_interface_names:
            # print("新接口:{} ".format(newKeys[i]))
            resFile.write("001新增的接口:" + new_interface_names[i] + "\n")
        else:
            # print("没有新增的接口!")
            same_interface_names.append(new_interface_names[i])

    # 2.找出去掉的接口
    for i in range(0, len(old_interface_names)):
        if old_interface_names[i] not in new_interface_names:
            # print("新接口:{} ".format(newKeys[i]))
            resFile.write("002去掉的接口:" + old_interface_names[i] + "\n")
        else:
            pass

    # 3. 找出改动接口中具体内层的变化
    for j in range(0, len(same_interface_names)):
        try:
            # 查找相同接口的里层描述信息不一致
            if new_interface_infos[same_interface_names[j]] != old_interface_infos[same_interface_names[j]]:
                inNewJson = new_interface_infos[same_interface_names[j]]
                inOldJson = old_interface_infos[same_interface_names[j]]
                # 获取接口信息不一致的接口的请求方法
                inNewKeys = get_keys(inNewJson)
                inOldKeys = get_keys(inOldJson)
                inSameKey = []
                # 1.找出改动接口中新增的请求方法 2.收集未改动的请求方法
                for i in range(0, len(inNewKeys)):
                    if inNewKeys[i] not in inOldKeys:
                        # print("新接口:{} ".format(newKeys[i]))
                        resFile.write("003改动的接口:" + same_interface_names[j] + "接口新增了请求方法:" + inNewKeys[i] + "\n")
                    else:
                        inSameKey.append(inNewKeys[i])
                # 2.找出已经去掉的请求方法
                for i in range(0, len(inOldKeys)):
                    if inOldKeys[i] not in inNewKeys:
                        resFile.write("003改动的接口:" + same_interface_names[j] + "接口去掉了请求方法:" + inOldKeys[i] + "\n")
                    else:
                        pass
                # 3.找出改动的请求方法
                for i in range(0, len(inSameKey)):
                    if inNewJson[inSameKey[i]] != inOldJson[inSameKey[i]]:
                        resFile.write("003改动的接口:" + same_interface_names[j] + "接口改动了请求方法:" + inSameKey[i] + "\n")

        except KeyError as e:
            print(e)
        except Exception as e:
            print(e)

    # 1.找出新增的body
    for i in range(0, len(new_body_names)):
        if new_body_names[i] not in old_body_names:
            resFile.write("004新增的body:" + new_body_names[i] + "\n")
        else:
            same_bodys.append(new_body_names[i])

    for i in range(0, len(old_body_names)):
        if old_body_names[i] not in new_body_names:
            resFile.write("删除的接口body有:" + old_body_names[i] + "\n")
        else:
            pass

    for j in range(0, len(same_bodys)):
        try:
            if new_bodys[same_bodys[j]] != old_bodys[same_bodys[j]]:
                # 接口参数包含body定义的字符串
                parameter_info = "'schema': {'$ref': '#/definitions/" + same_bodys[j]
                for i in new_interface_names:
                    for method in get_keys(new_interface_infos[i]):
                        in_body = new_interface_infos[i][method]['parameters']
                        if parameter_info in str(in_body):
                            resFile.write("参数改动的接口有:" + i + ' 接口' + method + '请求' + '修改了参数:' + str(new_bodys[same_bodys[j]]) + "\n")
        except Exception as e:
            print(e)

    resFile.close()

if __name__ == '__main__':
    checkAPIs()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值