升级Karate至1.4.1后,断言数组不存在的语句失效求助
问题解决:Karate 1.4.1中
Match each结合#notpresent失效的问题 问题背景
将Karate从1.1.0升级到1.4.1后,原断言语句:
And Match each response[*].foos[*].bars == "#notpresent"
执行失败,报错:
match failed: EACH_EQUALS $ | match each failed, empty array / list (LIST:STRING) [] '#notpresent'
需求是断言response中每个元素的foos数组(foos本身是数组)里的所有对象,都不包含名为bars的字段。
原因分析
Karate 1.4.x版本对match each的空数组处理逻辑做了严格调整:当foos是空数组时,foos[*].bars会返回空数组,此时用match each将空数组与#notpresent匹配会直接失败——因为#notpresent是断言字段不存在,而空数组是一个实际存在的空集合,并非字段不存在。
解决方案
改用#array every语法,直接对foos数组的每个元素做断言,同时兼容空数组的场景:
写法1(推荐)
And Match response[*].foos == '#array every _ not contains key "bars"'
该语句会同时处理两种情况:
- 当
foos为空数组时,断言自动成立(空数组的所有元素都满足条件) - 当
foos有元素时,检查每个元素都不包含bars字段
写法2(更严谨,确保foos本身是数组)
如果需要先确保response中每个元素的foos字段是数组类型,再做断言:
And Match response[*] == '#object every _.foos is #array' And Match response[*].foos == '#array every _ not contains key "bars"'
说明
这种写法在Karate 1.4.1及以上版本中能稳定工作,同时覆盖了空数组和非空数组的场景,避免了原写法中因空数组触发的匹配失败问题。
内容的提问来源于stack exchange,提问作者Hayi
相关产品推荐
相关产品推荐

