• 0
  • 0
分享

1.3 如何转存Swagger的内容

上一个小节,我们学习到了如何通过Swagger提供的接口,获取文档中所有的数据信息。我们拿到了所有的数据信息,发现是一个很大的Json报文,里面的结构在上个小节中也基本梳理清楚了。

下一步我们就要把核心的,也就是接口测试用例中要用到的数据,转存到一个Excel文件中。一直跟随我学习的童鞋们,会记得我们开发过一批类似的接口测试工具,都是使用Excel来编写测试用例,直接运行生成测试报告。如果我们能把Swagger中的接口信息,自动化的导出成接口工具对应格式的Excel,那么开发人员变更了服务端代码,Swagger文档自动更新,接口测试用例也会自动同步。

 准备一个固定格式的Excel

图7.jpg


有了这个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)
```


图8.jpg

从结果图可以看出,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': ' '}, {}, '', {}]...]
```


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • (一)Monkey简介Monkey意指猴子,顽皮淘气。所以Monkey测试,顾名思义也就像猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、滑动Trackball、手势输入等操作),来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,在功能测试完成后进行monkey测试。Monkey包括许多选项,它们大致分为四大类:(1)基本配置选项,如设置尝试的事件数量;(2)运行约束选项,如设置只对单独的一个包进行测试;(3)事件类型和频率;(4)调试选项;总结:Monkey测试用于发现App测试中的问题(如AN...
            15 15 1908
            分享
          • 1.移动APP安全风险分析*1.1安全威胁分析安全威胁从三个不同环节进行划分,主要分为客户端威胁、数据传输端威胁和服务端的威胁。1.2面临的主要风险1.3Android测试思维导图1.4反编译工具有两种反编译方式,dex2jar和apktool,两个工具反编译的效果是不一样的,dex2jar反编译出java源代码,apktool反编译出来的是java汇编代码。dex2jar主要是用来把之前zip解压出来的classed.dex转成jar包的jd-gui主要是用来打开Jar包的2本地客户端安全2.1反编译保护2.1.1问题描述APP源代码对于一个公司是非常重要的信息资源,对APP的保护也尤为重要...
            0 0 808
            分享
          • Android App兼容性测试是一个比较重要的App评价内容,实际上兼容性测试不仅仅和测试人员相关,在开发阶段就应当着重考虑,因为兼容性问题是除了实现App本身要求的功能后,必须要关注、而且至关重要的一个点。因此,App兼容性是否良好,首先要求App开发人员在开发阶段进行保障,有经验的Android工程师能够在开发过程中保证60%以上用户机型的兼容与适配,经验丰富的工程师几乎能够做到90%以上的兼容适配。当然,由于市场上Android机型出新速度快,系统升级快,一味的追求在开发阶段的兼容适配保障,一方面延误开发进度,另一方面需要较高的开发投入,因此需要做好权衡,这也是后续Android兼容性...
            0 0 854
            分享
          •   根据韩联社报道,三星和百思买在美国遭遇集体诉讼,原因是他们涉嫌虚假宣传部分三星 QLED 4K 电视的功能,这起诉讼是由加州中区法院的 Ray Kim Law 律师事务所于周一提起的。  据诉讼文件显示,三星的部分 QLED 4K 电视并未配备该公司和百思买所宣传的 Motion Xcelerator Turbo+、FreeSync 或 HDMI 2.1 端口。通常情况下,一些电视较小尺寸的版本缺乏某些功能。例如,43 英寸版本的 The Frame TV 不支持 120Hz 刷新率,而其他尺寸的电视则具有该功能。  Motion Xcelerator Turbo + 是一种通过插帧提高内...
            0 0 993
            分享
          •   关于Gato  Gato是一款针对GitHub的信息枚举和渗透测试工具,该工具是一个GitHub自托管的安全测试工具。在该工具的帮助下,广大蓝队研究人员或渗透测试安全研究人员就可以轻松评估目标组织的GitHub安全性,并尝试枚举其中存在安全问题的个人访问令牌或其他安全问题。  值得一提的是,GitHub建议仅将自托管运行程序用于私有存储库,然而有成千上万的组织仍然会在公共代码库中使用自托管运行程序。因此,该工具还可以搜索并枚举使用了自托管运行程序的GitHub公共存储库。  功能介绍  1、GitHub PAT特权枚举;  2、基于API的GitHub代码搜索枚举;  3、GitHub A...
            0 0 886
            分享
      • 51testing软件测试圈微信