JSON部分Schema匹配失败,如何实现无错的部分匹配?
实现Payload与部分Schema的无错误匹配
问题场景
尝试用部分Schema校验Payload时失败,原因是Payload包含Schema中未定义的额外字段,报错提示实际数据比预期多了多余的键。
相关代码示例
Payload定义
Given def payload = """ { "salesService": [ { "name": "Test User", "username": "testuser", "email": "test@user.com", "address": { "doorNo": 32, "street": "Kenlab Clise", "landmark": true, "city": "Bracknell", "county": "Berkshire", "zipcode": "LI867H" } } ] } """
Schema定义
* def schema = """ { "salesService": [ { "name": "#string", "username": "#string", "email": "#present" } ] } """
匹配语句
Then match payload contains schema
错误信息
$.salesService[0] | not equal | actual has 1 more key(s) than expected - {"address":{"doorNo":2,"street":"Kenton Close","landmark":true,"city":"Bracknell","county":"Berkshire","zipcode":"RG129AZ"}} (MAP:MAP) {"name":"Test User","username":"testuser","email":"test@user.com","address":{"doorNo":2,"street":"Kenton Close","landmark":true,"city":"Bracknell","county":"Berkshire","zipcode":"RG129AZ"}} {"name":"#string","username":"#string","email":"#present"}
解决方案
在Karate中,有两种常用方法实现忽略额外字段的部分匹配:
方法1:使用#ignore关键字
在Schema的对象中添加"#ignore": "#ignore",表示忽略所有未在Schema中定义的额外字段:
* def schema = """ { "salesService": [ { "name": "#string", "username": "#string", "email": "#present", "#ignore": "#ignore" } ] } """
方法2:使用#partial关键字
在需要忽略额外字段的对象前加上#partial标记,明确指定该对象仅校验Schema中定义的字段:
* def schema = """ { "salesService": [ #partial { "name": "#string", "username": "#string", "email": "#present" } ] } """
修改Schema后,再执行Then match payload contains schema语句,即可成功完成部分匹配,不再因额外字段报错。
内容的提问来源于stack exchange,提问作者Ritika Arora
相关产品推荐
相关产品推荐

