一 、背景
公司要做接口测试 然后所有的api数据都在yapi可视化接口管理平台中(不知道这个的可以百度查一下yapi),但是接口框架管理需要将所有的接口信息全部输入到excel中进行管理。
好了 问题来了 我们需要将yapi系统中所有的数据导入到excel,如果接口少那还好 我们手动就可以将接口信息写用例写在excel中了,但是这个始终不是明智之举,作为二十一世纪聪明的人类,我们得利用语言。
三、确定解决办法
利用pychon写个爬虫,yapi大部分是基于json响应,所以爬取起来非常方便。
确定了使用的语言,然后确定一下临时储存办法,试想一下 我们如果在yapi中利用python爬取到了接口的数据是否直接写进excel呢?这里小编为了以后能够直接对接自动生成接口测试用例,所以暂时先把所有的数据存到一个列表中,然后列表的每个值(值其实是个字典 字典中记录了接口的所有数据信息),最后利用pandas模块生成Excel
好了 说到这里 我们暂时先解决第一步吧 把数据爬取下来 储存到python数据类型列表中。
四、步骤
1.有关yapi接口流程性了解可以参考本人博客地址为 https://blog.csdn.net/Tester_xjp/article/details/83896013
2.如果你是已经使用过yapi系统的 那么就更好说了
3.步骤
第一步 根据yapi中产品的id 获取所有的模块id
第二步 根据模块id 找寻到所有的接口id
第三步 根据接口id 获取接口的所有数据 存到一个字典中 这里特别需要注意一下key为请求参数的他对应的值 也是个字典
第四步 在第三步中的每个字典 追加到一个列表中 而这个列表 储存了我们接口的所有数据信息。
第五步 利用我们储存的数据 将数据写入excel中
五、开源源代码
# author:xjp
# email:[email protected]
# filename:get_apidata.py
# project:python_code_warehouse
# datetime:2019/2/19 20:54
# software: PyCharm
# author: xiejiangpeng
# time:2018/11/7/20:35
# python:python3.6
# message: 获取yapi上面所有的api接口数据信息 包括:地址/更新时间/创建时间/请求方法/所属模块名/请求参数(value为字典)/预期响应/接口名称/创建者
import requests
import logging
import json
import time
import pandas as pd
class Yapi(object):
def __init__(self, userapi, passwdapi, group_id):
"""连接yapi初始化信息
:param userapi: yapi的登录账号
:param passwdapi: yapi的登录密码
:param group_id: yapi中所属产品的id(base:35 团购:176)
"""
self.logger = logging.getLogger("运行日志:")
self.logger.setLevel(logging.DEBUG)
self.handler = logging.FileHandler("log.txt")
self.handler.setLevel(logging.DEBUG)
self.conhandler = logging.StreamHandler()
self.conhandler.setLevel(logging.INFO)
self.formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
self.logger.addHandler(self.handler)
self.logger.addHandler(self.conhandler)
self.handler.setFormatter(self.formater)
self.conhandler.setFormatter(self.formater)
self.userapi = userapi
self.passwdapi = passwdapi
self.group_id = group_id
self.apiurl = "http://api.xxxxxx.com" # yapi对应域名
self.api = requests.session()
self.pathmodlename = "" # yapi上接口所属的模块名称
self.pathname = "" # 接口名称
self.path_data_lists = [] # 接口数据(list) 其中列表中的每个值是一个字典
self.path_key_dicts = {} # 用于生成Excel中第一行值对应的参数
self.list_params_path_address = [] # 所有的接口地址列表
self.list_params_up_time = [] # 所有的接口更新时间列表
self.list_params_add_time = [] # 所有的接口添加时间列表
self.list_params_method = [] # 所有的参数方法列表
self.list_params_modle_name = [] # 所有的接口所属模块名称列表
self.list_params_request_form_data = [] # 所有的请求参数列表
self.list_params_expected_response = [] # 所有的请求预期响应
self.list_params_path_name = [] # 所有的请求接口名称
self.list_params_path_creat_user = [] # 所有的接口创建者列表
self.count = 0
loginjson = {'email': self.userapi,
'password': self.passwdapi}
loginheader = {'Content-Type': 'application/json;charset=UTF-8'}
self.logger.info("api后台登录状态:" +
str(self.api.post(url=self.apiurl + "/api/user/login", data=json.dumps(loginjson),
verify=False, headers=loginheader).json().get("errmsg")))
def get_path_data(self):
"""获取path信息 根据产品id(group_id) 获取对应的模块id"""
getid = {'group_id': self.group_id, 'page': '1', 'limit': '500000'}
ids = self.api.get(url=self.apiurl + "/api/project/list", verify=False, params=getid).json().get("data").get(
"list")
for i in range(0, len(ids)):
self.pathmodlename = ids[i].get("name")
self.get_pathid_by_mouled_id(ids[i].get("_id"))
def get_pathid_by_mouled_id(self, _id):
"""通过模块id找寻path—id
:param _id: 模块id
"""
details = self.api.get(self.apiurl + "/api/interface/list?page=1&limit=9999&project_id=%s" % _id,
verify=False).json()
for j in range(0, len(details.get("data").get("list"))):
pathid = details.get("data").get("list")[j].get("_id")
self.get_pathdata_by_pathid(pathid)
def get_pathdata_by_pathid(self, pathid):
"""根据pathid获取每个接口的详细信息
:param pathid: 接口id
"""
pathdicts = {} # 记录每个接口的信息
pathdata = self.api.get(url=self.apiurl + "/api/interface/get?id=%s" % pathid, verify=False).json()
pathdicts["path_address"] = pathdata.get("data").get("path") # 接口地址
pathdicts["up_time"] = time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime(int(pathdata.get("data").get("up_time")))) # 接口变更时间
pathdicts["add_time"] = time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime(int(pathdata.get("data").get("add_time")))) # 接口添加时间
pathdicts["method"] = pathdata.get("data").get("method") # 接口请求方法
pathdicts["modle_name"] = self.pathmodlename # 接口所属模块名称
key_value_dict = {} # 请求表单的表单数据
for requestdatas in pathdata.get("data").get("req_query"):
flag = requestdatas.get("required")
key_value_dict[requestdatas.get("name")] = requestdatas.get("desc") + "(%s)" % ("必填" if flag else "非必填")
pathdicts["request_form_data"] = key_value_dict # 请求表单数据 key为参数名 value为字段说明(必填/非必填)
pathdicts["expected_response"] = pathdata.get("data").get("res_body") # 预期响应
pathdicts["path_name"] = pathdata.get("data").get("title") # 接口名称
pathdicts["path_creat_user"] = pathdata.get("data").get("username") # 接口创建者
self.path_data_lists.append(pathdicts) # 追加每个接口的数据信息到列表中
self.count += 1
self.logger.info("第%d个接口%s的数据已经抓取完毕" % (self.count, pathdicts["path_address"]))
def pathdata_to_excel(self):
"""将api数据写入excel"""
for pathdata in self.path_data_lists:
self.list_params_path_address.append(pathdata.get("path_address"))
self.list_params_up_time.append(pathdata.get("up_time"))
self.list_params_add_time.append(pathdata.get("add_time"))
self.list_params_method.append(pathdata.get("method"))
self.list_params_modle_name.append(pathdata.get("modle_name"))
self.list_params_request_form_data.append(pathdata.get("request_form_data"))
self.list_params_expected_response.append(pathdata.get("expected_response"))
self.list_params_path_name.append(pathdata.get("path_name"))
self.list_params_path_creat_user.append(pathdata.get("path_creat_user"))
self.path_key_dicts["接口名称"] = self.list_params_path_name
self.path_key_dicts["接口地址"] = self.list_params_path_address
self.path_key_dicts["接口请求方法"] = self.list_params_method
self.path_key_dicts["接口请求参数"] = self.list_params_request_form_data
self.path_key_dicts["接口预期响应"] = self.list_params_expected_response
self.path_key_dicts["接口所属模块名称"] = self.list_params_modle_name
self.path_key_dicts["接口创建时间"] = self.list_params_add_time
self.path_key_dicts["接口创建者"] = self.list_params_path_creat_user
self.path_key_dicts["接口最新修改时间"] = self.list_params_up_time
file_path = r'file/apidata.xlsx' # 文件需要保存路径
writer = pd.ExcelWriter(file_path)
df = pd.DataFrame(self.path_key_dicts)
df.to_excel(writer, columns=self.path_key_dicts.keys(), index=False, encoding='utf-8',
sheet_name='base接口数据')
writer.save()
if __name__ == "__main__":
xiejiangpeng = Yapi(userapi="userapi", passwdapi="passwdapi", group_id="id")
xiejiangpeng.get_path_data()
aipdatalist = xiejiangpeng.path_data_lists # api数据都在list中
xiejiangpeng.pathdata_to_excel()
六、运行截图
最后介绍一下我们的列表每个值的大概形式为
{'path_address': '/superAdmin/sms/SendTestSms', 'up_time': '2019-01-23 17:31:45', 'add_time': '2019-01-23 17:22:26', 'method': 'POST', 'modle_name': '短信模块', 'request_form_data': {'tel': '(必填)'}, 'expected_response': '', 'path_name': '发送测试短信', 'path_creat_user': '李昕'}
最后我们生成的excel截图为