高效接口测试(二)

1.2 如何获取Swagger的内容

上一个小节,我们学习到了什么是Swagger,使用它带来的好处有哪些。如果Swagger只提供了上一节说到的功能,那我们就不会特殊来讲它了。实际上Swagger起初就是一套标准,一套编写接口API文档的规范。既然是规范,就一定有固定的格式,既然有固定的格式,就可以解析它。有的同学可能要问,你为什么非要去解析它呢?在线调式的页面都有了,你还想要什么?我想要接口文档变更后,接口测试相关用例、脚本自动同步更新。

咱们还是一步步来,先不谈接口用例、脚本如何同步更新。说说如何自动化的获取到Swagger文档中的数据。如果Swagger能给我提供一个接口,我去调用它,就可以获取到文档中的所有数据。这些数据原本是展示在前端调式页面的信息,我现在可以直接获取它,那就太方便了。Swagger做到了我们想要的。

调用Swagger数据接口

我们在上一个小节,在8080端口部署了一个服务。我们还是访问8080端口,只是稍稍修改一下后面的路径,增加:/v2/api-docs

http://49.232.147.132:8080/v2/api-docs

api-swagger3.jpg

所有的数据全部以一个庞大的Json返回。下一步我们尝试使用Python的Requests类型调用这个接口。这么大的数据量还是需要脚本来做进一步处理。==关于如何使用Python对接口进行自动化测试,请参考我的《接口测试最佳实践》的第三章==

import requests
res = requests.get("http://49.232.147.132:8080/v2/api-docs")
print(res.text)

api-swagger4.jpg

到这一步结束,我们已经使用Python拿到了所有Swagger数据--Json字符串格式。

弄清楚Swagger的Json返回数据格式

有了数据,就要动手开始解析了。在解析之前要先弄清楚,这个庞大的Json内部的格式。网上有很多Json文档在线解析工具,作用就是把大的Json串重新排列,让大家能看清楚里面结构关系。

我们利用在线工具把Json节点收起,这样就会看的很清晰

api-swagger5.jpg

{
"swagger":"2.0",
"info":{},
"host":"49.232.147.132:8080",
"basePath":"/",
"tags":[],
"paths":{},
"securityDefinitions":{},
"definitions":{}
}

Json中有8个主要键值对

  • swagger:swagger版本号
  • info:接口服务的项目信息:项目描述、名称、项目版本号等
  • host:接口服务的主机名
  • basePath:接口服务的起始根路径
  • tags:接口服务中所有控制器的名称和描述
  • paths:每个接口的详细信息:地址、参数、响应等
  • securityDefinitions:接口的认证和授权方式信息
  • definitions:每个接口方法中每一个参数的类型说明

下一步,我们要进入几个主要键值对中。看看哪些参数是我们关心的。

tags
"tags": [
            {
                "name": "CmsPrefrenceAreaController",
                "description": "商品优选管理"
            },
            {
                "name": "UmsMemberLevelController",
                "description": "会员等级管理"
            },
            {
                "name": "SmsCouponHistoryController",
                "description": "优惠券领取记录管理"
            }...
        ]
paths
"paths": {
        "/admin/info": {
            "get": {
                "tags": [
                    "UmsAdminController"
                ],
                "summary": "获取当前登录用户信息",
                "operationId": "getAdminInfoUsingGET",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "*/*"
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/CommonResult"
                        }
                    },
                    "401": {
                        "description": "Unauthorized"
                    },
                    "403": {
                        "description": "Forbidden"
                    },
                    "404": {
                        "description": "Not Found"
                    }
                }
            }
        }....
}
definitions
"definitions":{
    "OmsUpdateStatusParam": {
            "type": "object",
            "properties": {
                "companyAddressId": {
                    "type": "integer",
                    "format": "int64",
                    "description": "收货地址关联id"
                },
                "handleMan": {
                    "type": "string",
                    "description": "处理人"
                },
                "handleNote": {
                    "type": "string",
                    "description": "处理备注"
                },
                "id": {
                    "type": "integer",
                    "format": "int64",
                    "description": "服务单号"
                },
                "receiveMan": {
                    "type": "string",
                    "description": "收货人"
                },
                "receiveNote": {
                    "type": "string",
                    "description": "收货备注"
                },
                "returnAmount": {
                    "type": "number",
                    "description": "确认退款金额"
                },
                "status": {
                    "type": "integer",
                    "format": "int32",
                    "description": "申请状态:1->退货中;2->已完成;3->已拒绝"
                }
            }
        }....
}