You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serenity BDD REST API Schema校验非预期通过问题排查

问题原因

这是JSON Schema校验默认规则导致的,不是Serenity BDD的bug,核心逻辑如下:

  • JSON Schema规范默认additionalProperties属性值为true,即只要Schema中明确定义的字段校验通过,响应里存在的、Schema没声明的字段不会触发校验失败。你删掉age字段定义后,响应里的age就属于未声明的额外字段,默认直接放行。
  • 空对象{}是合法的通用JSON Schema,按照规范它可以匹配任意合法JSON结构,所以不管接口返回什么,用空Schema校验都会通过。
  • 你调用的matchesJsonSchemaInClassPath方法默认没有开启严格校验模式,不会自动拦截未声明的额外字段。
解决方法

两种方案选其一即可:

方案1:给Schema文件添加严格校验规则

在所有type: object的节点下,增加"additionalProperties": false配置,明确声明该对象不允许出现未定义的额外字段。
修正后的严格版Schema示例:

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "integer"
    },
    "city": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "age",
    "city"
  ]
}

加完这个配置后,你删掉age字段定义的错误Schema在遇到响应中的age时会直接校验失败。
注意空Schema{}的问题无法通过配置解决,这是JSON Schema规范本身的定义,不要用空Schema做校验规则。如果要校验接口返回空对象,需要用明确的约束Schema:

{
  "type": "object",
  "additionalProperties": false,
  "properties": {}
}

这个Schema才会强制要求响应是无任何字段的空对象。

方案2:全局开启严格校验模式

如果不想每个Schema都手动加additionalProperties: false配置,可以在测试全局配置中开启RestAssured的严格Schema校验,开启后会自动拦截所有未在Schema中声明的额外字段,不需要修改现有Schema文件。
全局配置参考代码:

import io.restassured.RestAssured;
import io.restassured.config.RestAssuredConfig;
import io.restassured.module.jsv.JsonSchemaValidatorConfig;
import org.junit.BeforeClass;

@BeforeClass
public static void initGlobalConfig() {
    RestAssured.config = RestAssuredConfig.config()
            .jsonSchemaValidatorConfig(
                    JsonSchemaValidatorConfig.jsonSchemaValidatorConfig()
                            .checkedValidation(true)
            );
}

配置完成后,你遇到的“Schema少字段依然通过”的问题会直接修复。再次说明:空Schema{}依然会通过所有校验,这是JSON Schema规范的固有逻辑,不要使用空Schema作为校验规则即可。

补充说明

你之前测试的“修改字段类型测试会正常失败”是默认行为,类型校验属于强制校验项,不管开不开严格模式都会生效;而额外字段校验默认关闭,才会出现你遇到的漏判问题。

内容的提问来源于stack exchange,提问作者Muhammad Osama Saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:21:12