项目中,开发人员会使用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()