利用python爬取yapi中每个接口数据并且生成excel文档

一 、背景

公司要做接口测试 然后所有的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()

六、运行截图

利用python爬取yapi中每个接口数据并且生成excel文档_第1张图片

最后介绍一下我们的列表每个值的大概形式为

{'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截图为

利用python爬取yapi中每个接口数据并且生成excel文档_第2张图片

你可能感兴趣的:(软件测试,python,接口自动化)