接口测试--测试工具:rap2 接口文档解析
通过百度 OCR 工具识别 rap2 登录中的验证码,从而实现登录~那我们今天来实战解析 rap2 的接口数据,生成我们所需要的接口数据
实践上手
文档分析
1、我们先通过 F12 看看哪个接口是我们需要的?对~就是你了!
2、将接口数据复制到https://www.json.cn/,我们来看看接口数据结构,看看有哪些信息是需要的
3、通过分析 properties 中的数据,发现 pos=1 为请求头,pos=2 为路径参数,pos=3 为 body 参数,name 为字段名,value 为字段值,parentId=1,没有父节点;parentId!=-1,为父节点
代码解析
上一期中,有小伙伴反馈说,可以输入 cookies 不?那这次优化一下吧~
实现 rap2 登录并获取数据
@classmethod
def rap_data(cls, id, cookies = None):
"""
获取接口文档数据
:param id: 接口文档id
:param cookies: 非必填,登录的cookies
:return: 返回json数据
"""
params = {"id": id}
if cookies:
try:
cls.cookies = dict([i.split("=", 1) for i in cookies.split("; ")])
except Exception as e:
raise Exception('cookies格式不对,请重新输入!')
try:
res = requests.get(url=UrlConfig.RAP_PROJRCT_URL, params=params, cookies=cls.cookies).json()
except Exception as e:
raise Exception('cookies过期了,请重新输入!')
return res
else:
login_result = False
#判断是否登录成功
while not login_result:
login_result = Rap2Data.rap_login()
res = requests.get(url=UrlConfig.RAP_PROJRCT_URL, params=params, cookies=cls.cookies).json()
return res
解析关键代码展示:执行主入口
class Rap2Parse(object):
@classmethod
def api_data(cls, id, cookies=None, module=None):
json_obj = Rap2Data.rap_data(id, cookies)
errMsg = json_obj.get("errMsg")
#获取报错信息,将其抛出(权限不足、不存在接口文档,接口都会返回errMsg)
if errMsg:
errMsg = errMsg + f"请将接口文档授权给{Account.RAP['email']}!"
raise Exception(errMsg)
if module is None:
#模块名不传的话,默认获取所有模块数据
json_list = json_obj['data']['modules']
else:
#模块名传入,获取对应的模块数据
json_list = jsonpath(json_obj, f"$.data.modules[?(@.name=='{module}')]")
#校验传入的模块名是否存在
if not json_list:
raise Exception(f"{module}模块名不存在")
# 接口文档标题名,作为后续的文件名
file_name = json_obj.get('data').get('name')
#对标题名特殊处理
special_str = r"[\/\\\:\*\?\"\<\>\|]"
file_name = re.sub(special_str, "-", file_name)
data = []
#遍历模块数据
for i in json_list:
modules_data = {}
#模块名
modules_data['modules'] = i['name']
#模块描述
modules_data['description'] = i['description']
interfaces = []
#遍历interfaces接口数据
for i, dto in enumerate(i['interfaces']):
cases_data = {}
#接口id
cases_data['api_id'] = i + 1
#接口名
cases_data['title'] = dto['name']
#接口描述
cases_data['description'] = dto['description']
#接口路径
cases_data['url'] = dto['url']
#接口请求方法
cases_data['method'] = dto['method']
#获取接口的入参和出参
properties_list = jsonpath(dto['properties'], f"$.[?(@.scope=='request')]")
#接口请求头数据
cases_data['headerData'] = cls.parent_data(properties_list)[2]
#接口query参数
cases_data['queryData'] = cls.parent_data(properties_list)[1]
#接口body参数
cases_data['data'] = cls.parent_data(properties_list)[0]
interfaces.append(cases_data)
modules_data['cases_data'] = interfaces
data.append(modules_data)
return data, file_name
组装参数
@classmethod
def join_data(cls, json_data, properties, name, type, value, parentId, api_id):
"""
组装参数
:param json_data: 字典值(存数据用)
:param properties: 接口的入参和出参数据
:param name: 接口名
:param type: 字段类型
:param value: 字段值
:param parentId: 父id
:param api_id: 所有的参数id
:return: json_data
"""
#特殊字符替换
name = name.replace(".","")
#没有父id,直接塞进json_data
if parentId == -1:
v = cls.change_value(type, value)
json_data[name] = v
#有父id且父id在api_id中
elif parentId != -1 and parentId in api_id:
#根据父id获取父id的数据
parent_dto = jsonpath(properties, f"$.[?(@.id=={parentId})]")
if not parent_dto:
raise Exception("接口文档维护有误")
parent_dto = parent_dto[0]
#如果父的类型为数组
if parent_dto['type'] == 'Array':
#找到父的key
parent_array = cls.search_value(json_data, parent_dto['name'])
v = cls.change_value(type, value)
#将子数据挂载在父下面
parent_array[0][name] = v
# 如果父的类型为对象
elif parent_dto['type'] == 'Object':
# 找到父的key
parent_object = cls.search_value(json_data, parent_dto['name'])
v = cls.change_value(type, value)
# 将子数据挂载在父下面
parent_object[name] = v
else:
raise Exception("父数据类型不支持")
else:
pass
# raise Exception("父数据类型不支持")
return json_data
递归找对应的 key 数据
@classmethod
def search_value(cls, data, key):
"""
递归找到所在key的数据
:param data: 数据
:param key: 需要找的key
:return:
"""
key = key.replace(".", "")
json_data = JsonSearch(object=data)
path = json_data.search_first_path(key)
path_str = cls.path_str(path)
value = jsonpath(data, path_str)[0]
return value
解析后数据展示
项目地址:https://github.com/JokerChat/ApiDocParse
后续扩展
- 将数据生成 Excel 格式的接口自动化用例
- 将数据生成 yaml 格式接口自动化用例
- 将数据生成生成 jmeter 脚本 (jmx)
- 基于上述功能,做成前端页面,供其他人使用

接口测试--测试工具:rap2 接口文档解析的更多相关文章
- api接口测试工具和接口文档管理工具
api接口测试工具和接口文档管理工具 1.postman(https://www.getpostman.com) Postman 是一个很强大的 API调试.Http请求的工具.她可是允许用户发送任何 ...
- PCB WebAPI 接口测试工具与接口文档生成
我们自己写WebAPI或调用对方系统提供的WebAPI时,测试WebAPI接口工具用哪些工具呢. 这里将3种WebAPI常用到的工具使用说明.主要是讲对第3种WebApiTestClientWebAp ...
- [工具]Swagger-api接口文档描述
摘要 工作中经常的用到webapi,之前都是提供的使用postman模拟请求的截图,非常的不方便,如果能在项目中集成一个在线查看接口说明的地方,肯定更方便更直观.在网上看到swagger这个组件,界面 ...
- Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)
[备注说明]内文中的图片由于页面的限制,图片显示不清晰,为了能更加的看清图片,请点击"图片",点击"右键"选择"在新标签页中打开图片",可查 ...
- 接口文档管理工具-Postman、Swagger、RAP(转载)
接口文档管理工具-Postman.Swagger.RAP 转自:http://www.51testing.com/html/10/n-3715910.html 在项目开发测试中,接口文档是贯穿始终的. ...
- .net core的Swagger接口文档使用教程(一):Swashbuckle
现在的开发大部分都是前后端分离的模式了,后端提供接口,前端调用接口.后端提供了接口,需要对接口进行测试,之前都是使用浏览器开发者工具,或者写单元测试,再或者直接使用Postman,但是现在这些都已经o ...
- SpringBoot集成Swagger(Swagger的使用),生成接口文档,方便前后端分离开发
首先上一张成果图. 1.Maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId&g ...
- Go语言使用swagger生成接口文档
swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言.Swagger与一组开源软件工具一起使用,以设计.构建.记录和使用RESTful Web服 ...
- 前后端分离之【接口文档管理及数据模拟工具docdoc与dochelper】
前后端分离的常见开发方式是: 后端:接收http请求->根据请求url及params处理对应业务逻辑->将处理结果序列化为json返回 前端:发起http请求并传递相关参数->获取返 ...
随机推荐
- 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)
137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...
- PAT乙级:1094 谷歌的招聘 (20分)
PAT乙级:1094 谷歌的招聘 (20分) 题干 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面 ...
- Ubuntu 20.04 安装kodi播放器
打开终端,执行命令在线安装 sudo apt-get install software-properties-common sudo add-apt-repository ppa:team-xbmc/ ...
- VM12升级VM15
之前一直用的12,现在想要升级为15.主要是为了解决kali操作系统版本兼容问题 打开VM12,点击[帮助]-->[软件更新]--> [检查更新] 发现有VM15,点击[了解详情] VM1 ...
- 15Java进阶 进程
1 线程控制 t.join():让主线程进入线程池,等待t执行完才执行. t.sleep():让线程阻塞,休眠一段时间,休眠结束后进入就绪状态.不会释放锁. t.yield():让线程让出CPU,从运 ...
- jvm源码解读--02 Array<u1>* tags = MetadataFactory::new_writeable_array<u1>(loader_data, length, 0, CHECK_NULL); 函数引入的jvm内存分配解析
current路径: #0 Array<unsigned char>::operator new (size=8, loader_data=0x7fd4c802e868, length=8 ...
- vue知识点----element UI+vue关于日期范围选择的操作,picker-options属性的使用
需求场景如下: 指定起止日期,后选的将会受到先选的限制 不同的日期选择器,不过也存在关联关系 实现方法不难,利用了 change 事件,动态改变 picker-options 中的 disableDa ...
- linux ifconfig不可用
Q: A: 源出问题,修改源:进入源:源地址 /etc/apt/ sudo vi sources.list,将下列内容替换sources.list中的内容,并保存 deb http://mirrors ...
- 大数据学习(10)—— Hive进阶
前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧. Hive Serde 参考Hive Serde Serde是啥 Serde是序列化和反序列化 ...
- IDEA使用Tomcat时控制台乱码的解决方案>从零开始学JAVA系列
IDEA使用Tomcat时控制台乱码的解决方案 解决方案1,修改启动时虚拟机参数 解决方案2,修改idea的设置 解决方案3,修改idea配置文件 在最后添加一行 '-Dfile.encoding=U ...