当前位置: 首页 > 知识库问答 >
问题:

JSON Scehma验证在放心中是如何工作的?

郭知
2023-03-14

我正在尝试使用模式验证响应JSON。即使尝试使用错误的模式验证响应,测试用例也会通过。

JSON响应:

[
    {
        "downlinkBytes": 478,
        "firstProcessTime": {
            "millisSinceEpoch": 1501113600000,
            "daysSinceEpoch": 17374,
            "month": 7,
            "year": 2017,
            "day": 27
        },
        "sliceMonth": 5,
        "sliceYear": 2017,
        "totalBytes": 548,
        "updatedProcessTime": {
            "millisSinceEpoch": 1514764800000,
            "daysSinceEpoch": 17532,
            "month": 1,
            "year": 2018,
            "day": 1
        },
        "uplinkBytes": 54,
        "key": {
            "slicePeriod": {
                "millisSinceEpoch": 1493596800000,
                "daysSinceEpoch": 17287,
                "month": 5,
                "year": 2017,
                "day": 1
            },
            "serviceProvider": "ABC"
        }
    }
]

JSON模式:

{
    "type" : "array",
    "items" : {
        "downlinkBytes" : {"type" : "number", "required" : true},
        "firstProcessTime" : {
            "type" : "object",
            "properties" : {
                "millisSinceEpoch" : {"type" : "number", "required" : true},
                "daysSinceEpoch" : {"type" : "number", "required" : true},
                "month" : {"type" : "number", "required" : true},
                "year"  : {"type" : "number", "required" : true},
                "day" : {"type" : "number", "required" : true}
            }
        },
        "sliceMonth" : {"type" : "number", "required" : true},
        "sliceYear" : {"type" : "number", "required" : true},
        "totalBytes" : {"type" : "number", "required" : true},
        "updatedProcessTime" : {
            "type" : "object",
            "properties" : {
                "millisSinceEpoch" : {"type" : "number", "required" : true},
                "daysSinceEpoch" : {"type" : "number", "required" : true},
                "month" : {"type" : "number", "required" : true},
                "year"  : {"type" : "number", "required" : true},
                "day" : {"type" : "number", "required" : true}
            }
        },
        "uplinkBytes" : {"type" : "number", "required" : true},
        "key" : {
            "type" : "object",
            "properties" : {
                "server_imsi" : {"type" : "number", "required" : true},
                "millisSinceEpoch" : {"type" : "number", "required" : true},
                "daysSinceEpoch" : {"type" : "number", "required" : true},
                "month" : {"type" : "number", "required" : true},
                "year"  : {"type" : "number", "required" : true},
                "day" : {"type" : "number", "required" : true}
            }
        },
        "serviceProvider" : {"type" : "string", "required" : true}
    }
}

我预计这里会出现错误,因为响应不包含所需的served_imsi值。但考验正在通过。

Response response = RestAssured.given().when().get(getURL);
response.then().statusCode(Numbers.TWO_HUNDRED);
response.then().assertThat().body(JsonSchemaValidator.matchesJsonSchemaInClasspath("Schema.json"));

共有1个答案

罗源
2023-03-14

我找到了解决方案。它没有抛出错误的原因是因为Schema中没有提到id键。

更新的架构:

{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {

},
"id": "http://localhost:8080/xxx/abc/monthly/ABC/5/2017",
"items": {
    "additionalProperties": false,
    "id": "/items",
    "properties": {
        "downlinkBytes": {
            "id": "/items/properties/downlinkBytes",
            "type": "number"
        },
        "firstProcessTime": {
            "additionalProperties": false,
            "id": "/items/properties/firstProcessTime",
            "properties": {
                "day": {
                    "id": "/items/properties/firstProcessTime/properties/day",
                    "type": "number"
                },
                "daysSinceEpoch": {
                    "id": "/items/properties/firstProcessTime/properties/daysSinceEpoch",
                    "type": "number"
                },
                "millisSinceEpoch": {
                    "id": "/items/properties/firstProcessTime/properties/millisSinceEpoch",
                    "type": "number"
                },
                "month": {
                    "id": "/items/properties/firstProcessTime/properties/month",
                    "type": "number"
                },
                "year": {
                    "id": "/items/properties/firstProcessTime/properties/year",
                    "type": "number"
                }
            },
            "required": [
                "month",
                "year",
                "day",
                "daysSinceEpoch",
                "millisSinceEpoch"
            ],
            "type": "object"
        },
        "key": {
            "additionalProperties": false,
            "id": "/items/properties/key",
            "properties": {
                "serviceProvider": {
                    "id": "/items/properties/key/properties/serviceProvider",
                    "type": "string"
                },
                "slicePeriod": {
                    "additionalProperties": false,
                    "id": "/items/properties/key/properties/slicePeriod",
                    "properties": {
                        "day": {
                            "id": "/items/properties/key/properties/slicePeriod/properties/day",
                            "type": "number"
                        },
                        "daysSinceEpoch": {
                            "id": "/items/properties/key/properties/slicePeriod/properties/daysSinceEpoch",
                            "type": "number"
                        },
                        "millisSinceEpoch": {
                            "id": "/items/properties/key/properties/slicePeriod/properties/millisSinceEpoch",
                            "type": "number"
                        },
                        "month": {
                            "id": "/items/properties/key/properties/slicePeriod/properties/month",
                            "type": "number"
                        },
                        "year": {
                            "id": "/items/properties/key/properties/slicePeriod/properties/year",
                            "type": "number"
                        }
                    },
                    "required": [
                        "month",
                        "year",
                        "day",
                        "daysSinceEpoch",
                        "millisSinceEpoch"
                    ],
                    "type": "object"
                }
            },
            "required": [
                "serviceProvider",
                "slicePeriod"
            ],
            "type": "object"
        },
        "sliceMonth": {
            "id": "/items/properties/sliceMonth",
            "type": "number"
        },
        "sliceYear": {
            "id": "/items/properties/sliceYear",
            "type": "number"
        },
        "totalBytes": {
            "id": "/items/properties/totalBytes",
            "type": "number"
        },
        "updatedProcessTime": {
            "additionalProperties": false,
            "id": "/items/properties/updatedProcessTime",
            "properties": {
                "day": {
                    "id": "/items/properties/updatedProcessTime/properties/day",
                    "type": "number"
                },
                "daysSinceEpoch": {
                    "id": "/items/properties/updatedProcessTime/properties/daysSinceEpoch",
                    "type": "number"
                },
                "millisSinceEpoch": {
                    "id": "/items/properties/updatedProcessTime/properties/millisSinceEpoch",
                    "type": "number"
                },
                "month": {
                    "id": "/items/properties/updatedProcessTime/properties/month",
                    "type": "number"
                },
                "year": {
                    "id": "/items/properties/updatedProcessTime/properties/year",
                    "type": "number"
                }
            },
            "required": [
                "month",
                "year",
                "day",
                "daysSinceEpoch",
                "millisSinceEpoch"
            ],
            "type": "object"
        },
        "uplinkBytes": {
            "id": "/items/properties/uplinkBytes",
            "type": "number"
        }
    },
    "required": [
        "key",
        "totalBytes",
        "updatedProcessTime",
        "uplinkBytes",
        "sliceMonth",
        "downlinkBytes",
        "sliceYear",
        "firstProcessTime"
    ],
    "type": "object"
},
"type": "array"

}

它现在可以正确验证。:)

有帮助的链接:

http://json-schema-validator.herokuapp.com/

https://jsonschema.net/#/editor

 类似资料:
  • 放心,当我们这样做时 抛出的错误总是连续的,也就是说,如果状态代码失败,它不会检查contentType是否是JSON。 此外,抛出的错误始终是,断言错误(预期:200,实际:404)。无法从中了解实际响应是什么,如果启用日志记录,它将打印在标准输出上,但其他任何方式都不可用。 是否有任何方法来构建或设置类似于我们如何实现<code>过滤器 我有一个 rest api 框架,其中大多数验证都是使用

  • 在katalon studio中为我的测试用例添加了一个新的自定义关键字,我正在创建隐式等待,上面的代码使我能够接收一条NoTouchElement异常消息,但我不知道隐式等待中规定的时间是否完全有效。有人能帮我弄清楚吗?非常感谢你!

  • 我有一个示例JSON响应 如何验证何时然后当然后 尝试过类似的东西,但它不起作用。 我错过了什么还是做错了什么?

  • 我是大一新生,请放心。我有一个获取响应体的简单测试,我想验证响应体是否与我的POJO类匹配。 这是我的测试: 这是我的POJO类: 那么如何验证响应体结构等于我的POJO类呢? 提前感谢

  • 有人能给我一个逐步描述如何基于cookie的身份验证工作吗?我从来没有做过任何涉及身份验证或cookie的事情。浏览器需要做什么?服务器需要做什么?按什么顺序?我们怎么保证东西安全?

  • null 我浏览了完整的flink仪表板,但我没有得到任何线索,如何检查是增量检查点正在发生还是完全检查点正在发生。请帮助我如何设置RocksDB的日志记录来了解增量检查点是否正在发生。我在文档中看到RocksDB日志记录会在性能和存储方面造成巨大的成本,这是为了测试目的,之后我将禁用它