Karate复杂JSON Schema验证未按预期工作,求解决方案
Karate 1.4.1.RC3 中 JSON Schema 验证问题排查与解决
问题背景
项目尝试使用Karate进行JSON Schema验证,参考相关方案后,在1.4.1.RC3版本测试时遇到异常:包含空数组的元素无法通过验证,尽管对应Bug声称在v0.8.0版本已修复。
测试Feature代码
Feature: JSON Schema validation Background: * def json = """ { "foo": { "bars": [ { "barOne": "dc", "barTwos": [] }, { "barOne": "dc", "barTwos": [{ title: 'blah' }] }, { "barOne": "dc", "barTwos": [{ title: 'blah' }] }, { "barOne": "dc", "barTwos": [{ title: 'blah' }] } ] } } """ * def barTwo = { title: '#string' } * def bar = """ { barOne: '#string', barTwos: '##[] barTwo' } """ Scenario: Validate JSON Schema * match json.foo.bars == '#[] bar'
错误输出
match failed: EQUALS
$ | match each failed at index 0 (LIST:MAP)
[{"barOne":"dc","barTwos":[]},{"barOne":"dc","barTwos":[{"title":"blah"}]},{"barOne":"dc","barTwos":[{"title":"blah"}]},{"barOne":"dc","barTwos":[{"title":"blah"}]}]
{"barOne":"#string","barTwos":"##[] barTwo"}
$[0] | not equal | match failed for name: 'barTwos' (MAP:MAP) {"barOne":"dc","barTwos":[]} {"barOne":"#string","barTwos":"##[] barTwo"} $[0].barTwos | match each failed, empty array / list (LIST:MAP) [] {"title":"#string"}
解决方案
问题核心是*##[]* barTwo的匹配规则:它要求数组必须包含至少一个符合barTwo结构的元素,但第一个元素的barTwos是空数组,触发验证失败。要兼容空数组和非空数组场景,需改用*#[]* barTwo(单井号),该规则允许数组为空,或每个元素符合barTwo结构。
修改后的bar定义:
* def bar = """ { barOne: '#string', barTwos: '#[] barTwo' } """
也可以用#?表达式显式处理空数组场景:
* def bar = """ { barOne: '#string', barTwos: '#? _ == [] || _ == #[] barTwo' } """
两种写法均可让空数组、非空数组场景通过验证,同时保证非空数组元素符合barTwo结构要求。
内容的提问来源于stack exchange,提问作者Jigar
相关产品推荐
相关产品推荐

