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
相关产品推荐
相关产品推荐

