Karate框架下基于customerType的条件JSON Schema校验不生效如何解决?
错误点梳理
- 校验逻辑写反:
customerType为org时你错误匹配了personSchema,为person时错误匹配了orgSchema - 表达式返回值不符合要求:
karate.match()返回的是校验结果对象,必须取.pass属性得到布尔值,才能作为#?校验表达式的合法返回值 - 字段引用方式不合理:独立schema文件中不要用
response.前缀引用响应字段,用$指代响应根节点更稳妥,避免上下文变量冲突 - 可选优化:如果要求非对应场景下关联字段完全不存在(而非值为null),可以把
#?替换为##?,双井号标识该字段为可选字段
正确Schema示例
如果子schema和主schema存在同一个JSON文件中,写法如下:
{ // 定义person字段的校验schema "personSchema": { "firstName": "#string", "lastName": "#string" }, // 定义organization字段的校验schema "orgSchema": { "orgName": "#string", "orgAddress": "#string" }, // 主校验schema "mainSchema": { "customerType": "#string", "organization": "##? $.customerType == 'org' ? karate.match(_, orgSchema).pass : _ == null", "person": "##? $.customerType == 'person' ? karate.match(_, personSchema).pass : _ == null", "id": "#number", "requestDate": "#string" } }
如果子schema是独立的文件,替换orgSchema/personSchema为karate.read('对应文件路径')即可,示例:
"organization": "##? $.customerType == 'org' ? karate.match(_, karate.read('classpath:schemas/org.json')).pass : _ == null"
Feature文件调用方式
# 读取schema文件 * def customerSchema = karate.read('classpath:schemas/customer-main.json').mainSchema # 执行校验 Then match response == customerSchema
注意事项
注意检查字段拼写,你示例中person下的字段写为fistName,如果实际接口返回和schema定义的字段名不一致,也会导致校验失败。
内容的提问来源于stack exchange,提问作者stackoverflow
相关产品推荐
相关产品推荐

