1.3 如何转存Swagger的内容
上一个小节,我们学习到了如何通过Swagger提供的接口,获取文档中所有的数据信息。我们拿到了所有的数据信息,发现是一个很大的Json报文,里面的结构在上个小节中也基本梳理清楚了。
下一步我们就要把核心的,也就是接口测试用例中要用到的数据,转存到一个Excel文件中。一直跟随我学习的童鞋们,会记得我们开发过一批类似的接口测试工具,都是使用Excel来编写测试用例,直接运行生成测试报告。如果我们能把Swagger中的接口信息,自动化的导出成接口工具对应格式的Excel,那么开发人员变更了服务端代码,Swagger文档自动更新,接口测试用例也会自动同步。
准备一个固定格式的Excel
有了这个Excel我们就只需要按列来查找数据,找到了填写进去就可以啦!每一行是一个接口测试的具体用例。
说起来简单,实际处理起来会有很多特殊情况。因为接口的方法类型、参数格式、请求头信息都会不同,所以要分开处理,全部考虑周全。
我们化繁为简,先挑选两类最典型的请求类型。
- 带有参数的GET请求
- 带有正文参数的POST请求
我们挑选两个典型接口全部来自本次演示项目的后台用户管理模块:UmsAdminController
GET : /admin/list
POST : /admin/login
先来看第一个GET请求的具体信息,在Swagger返回的Json报文中是如何存在的。
``` "/admin/list":{ "get":{ "tags":[ "UmsAdminController" ], "summary":"根据用户名或姓名分页获取用户列表", "operationId":"listUsingGET_13", "consumes":[ "application/json" ], "produces":[ "*/*" ], "parameters":[ { "name":"name", "in":"query", "description":"name", "required":false, "type":"string" }, { "name":"pageSize", "in":"query", "description":"pageSize", "required":false, "type":"integer", "default":5, "format":"int32" }, { "name":"pageNum", "in":"query", "description":"pageNum", "required":false, "type":"integer", "default":1, "format":"int32" } ], "responses":{ "200":{ "description":"OK", "schema":{ "$ref":"#/definitions/CommonResult«CommonPage«UmsAdmin»»" } }, "401":{ "description":"Unauthorized" }, "403":{ "description":"Forbidden" }, "404":{ "description":"Not Found" } } } } ```
对比之前的Excel表格:
- 第1层 k-v 中,key为请求地址
- 第2层 k-v 中,key为请求方法类型
- 第3层 k-v 中,summary为接口描述
- 第3层 k-v 中,parameters为具体的参数列表
- parameters中的每一项是一个具体的参数细节:
name:参数名称
in:参数存在位置。query即为url地址栏后接参数
required:是否为必填项。(利用它,后面自动组合参数很方便哟)
default:默认值
接着再来看第二个POST请求的具体信息。
``` "/admin/login":{ "post":{ "tags":[ "UmsAdminController" ], "summary":"登录以后返回token", "operationId":"loginUsingPOST", "consumes":[ "application/json" ], "produces":[ "*/*" ], "parameters":[ { "in":"body", "name":"umsAdminLoginParam", "description":"umsAdminLoginParam", "required":true, "schema":{ "$ref":"#/definitions/UmsAdminLoginParam" } } ], "responses":{ "200":{ "description":"OK", "schema":{ "$ref":"#/definitions/CommonResult" } }, "201":{ "description":"Created" }, "401":{ "description":"Unauthorized" }, "403":{ "description":"Forbidden" }, "404":{ "description":"Not Found" } } } } ```
与上一个GET请求不同的点如下:
- consumes:为请求的正文格式(get中可能写错,忽略它)
- parameters中的in 字段:此时的body代表参数在请求正文中
下面我们使用Python,获取Excel中每个用例需要填写的信息,也就是每个接口的核心参数。如果能将它们成功输出到控制台,就已经成功一半了!
基本思路也很清晰:
准备一个大的列表--->请求Swagger数据接口-->拿到Json-->使用JsonPath解析出想要的参数-->每个接口的参数封装成列表的一个数据项
解析paths数据--paths中存储着每个接口的详细信息**
``` import requests import jsonpath res = requests.get("http://49.232.147.132:8080/v2/api-docs") data_source = res.json() #jsonpath只要字典,所以要转化 paths = jsonpath.jsonpath(data_source, '$.paths')[0] #jsonpath默认找回一个列表,虽然只匹配到一个paths print(paths) ```
从结果图可以看出,paths就是一个大的字典,每个接口单独以一个k-v键值对存在。我们下一步就要循环这个字典,进入每个键值对去获取具体信息。
获取具体接口信息
这部分看似比较复杂,实际上参考之前的Json结构,一步步细心解析就好。
``` import requests import jsonpath res = requests.get("http://49.232.147.132:8080/v2/api-docs") data_source = res.json() paths = jsonpath.jsonpath(data_source, '$.paths')[0] cases_list = [] for k, v in paths.items(): url = k #接口地址 method = '' #方法类型 summary = '' #接口描述 consumes = '' #请求正文类型 headers = {} #请求头中的参数 query = {} #URL地址栏中的参数 body = {} #请求正文中的参数 for m, infos in v.items(): method = m summary = infos.get('summary') if method == 'post': consumes = infos.get('consumes')[0] parameters = infos.get('parameters') if parameters: for p in parameters: if p['in'] == 'header': headers[p['name']] = ' ' elif p['in'] == 'query': query[p['name']] = ' ' elif p['in'] == 'body': body[p['name']] = ' ' #保持和Excel表格列的顺序一致 cases_list.append([summary, url, method, query, headers, consumes, body]) print(cases_list) ``` ``` [['删除指定用户信息', '/admin/delete/{id}', 'post', {}, {}, 'application/json', {}], ['获取当前登录用户信息', '/admin/info', 'get', {}, {}, '', {}], ['根据用户名或姓名分页获取用户列表', '/admin/list', 'get', {'name': ' ', 'pageSize': ' ', 'pageNum': ' '}, {}, '', {}]...] ```