前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口自动化测试之JSON Schema模式该如何使用?

接口自动化测试之JSON Schema模式该如何使用?

原创
作者头像
Hogwarts_测试
发布2022-08-08 09:35:07
1K0
发布2022-08-08 09:35:07
举报

原文链接

JSON Schema 模式是一个词汇表,可用于注释和验证 JSON 文档。在实际工作中,对接口返回值进行断言校验,除了常用字段的断言检测以外,还要对其他字段的类型进行检测。对返回的字段一个个写断言显然是非常耗时的,这个时候就需要一个模板,可以定义好数据类型和匹配条件,除了关键参数外,其余可直接通过此模板来断言,JSON Schema 可以完美实现这样的需求。

JSON Schema 官网:

http://json-schema.org/implementations.html

环境准备

安装 JSON Schema 包

  • Python 版本
代码语言:txt
复制
pip install jsonschema
  • Java 版本
代码语言:txt
复制
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.0.1</version>
</dependency>

<strong><em>JSON Schema 的使用</em></strong>

JSON Schema 模板生成

首先要借助于 JSON Schema tool 的网站 https://www.jsonschema.net/,将返回 json 字符串复制到页面左边,然后点击 INFER SHCEMA,就会自动转换为 schema json 文件类型,会将每个地段的返回值类型都设置一个默认类型,在 pattern 中也可以写正则进行匹配。

image.png
image.png

点击“设置”按钮会出现各个类型返回值更详细的断言设置,这个就是 schema 最常用也是最实用的功能。也可以对每种类型的字段最更细化的区间值校验或者断言,例如长度、取值范围等。

点击复制按钮,可以将生成的 schema 模板保存下来。

实战练习

接下来会发起一个 post 请求,验证响应值中的 url 字段与 origin 字段是否都为 string 类型。

Python版本
代码语言:txt
复制
import requests
from jsonschema import validate
def test_schema():
    schema = {
          "type": "object",
          "properties": {
            "url": {
              "type": "string"
            },
            "origin": {
              "type":"string"
            }
          }
        }
    r = requests.post("https://httpbin.ceshiren.com/post")
    validate(instance=r.json(), schema=schema)

如果将 origin 的 type 写成 number ,则会出现报错:

代码语言:txt
复制
import requests
from jsonschema import validate
def test_schema():
    schema = {
          "type": "object",
          "properties": {
            "url": {
              "type": "string"
            },
            "origin": {
              "type":"number"
            }
          }
        }
    r = requests.post("https://httpbin.ceshiren.com/post")
    validate(instance=r.json(), schema=schema)

返回报错信息

代码语言:txt
复制
> raise error
E jsonschema.exceptions.ValidationError: 'xxx.xxx.xxx.xxx' is not of type 'number'
E Failed validating 'type' in schema['properties']['origin']:
E {'type': 'number'}

同理,若将 url 的 type 改为 number,也会有报错提示。

代码语言:txt
复制
> raise error
E jsonschema.exceptions.ValidationError: 'https://httpbin.ceshiren.com/post' is not of type 'number'   
E Failed validating 'type' in schema['properties']['url']:
E {'type': 'number'}
Java 版本

JsonValidator.json 文件中存放校验文件,校验响应值中的 url 字段与 origin 字段是否都为 string 类型,文件内容为:

代码语言:txt
复制
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "origin": {
      "type":"string"
    }
  }
}

同 Python 版本一致,以下代码校验响应值是否符合 JsonValidator.json 文件中规定的格式要求。

代码语言:txt
复制
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
import static io.restassured.RestAssured.*;

public class Requests {
    public static void main(String[] args) {
        //定义请求头信息的contentType为application/json
        given().when().
                post("https://httpbin.ceshiren.com/post").
                then().assertThat().
                body(matchesJsonSchemaInClasspath("JsonValidator.json"));

    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装 JSON Schema 包
    • JSON Schema 模板生成
      • Python版本
        • Java 版本
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档