使用变量传递子串时match校验失败问题咨询
Karate中
match each contains使用变量匹配子串失败的问题 问题场景
我在Payload的data标签中设置值为'test',执行以下Karate脚本时出现匹配失败:
* set test.input.data = 'test' * def listData = ["testcoding", "testcoding", "testcoding"] * match each listData contains '#(test.input.data)'
错误信息
执行后返回错误:
$ | match each failed at index 0 (LIST:STRING) ["testcoding", "testcoding", "testcoding"] '#(test.input.data)' $ [0] | not equal (STRING:STRING) 'testcoding' 'test'
正常通过的情况
但直接将子串值写死在match语句中时,校验可以正常通过:
* set test.input.data = 'test' * def listData = ["testcoding", "testcoding", "testcoding"] * match each listData contains 'test'
补充验证
当test.input.data的值是列表元素的完整字符串而非子串时,使用变量的match each contains可以正常通过校验:
* set test.input.data = 'testcoding' * def listData = ["testcoding", "testcoding", "testcoding"] * match each listData contains '#(test.input.data)'
结果:校验通过
疑问
这是预期行为吗?为何使用变量传递子串时校验会失败?我是否操作有误?
解答
这是Karate框架的预期行为,核心原因是match each ... contains语法对变量表达式的处理逻辑:
- 当直接写
contains 'test'时,Karate识别为子串包含校验,会检查列表元素是否包含指定子串; - 当使用
contains '#(test.input.data)'时,Karate会先解析变量值,随后将其作为完整字符串执行精确相等校验,而非子串包含逻辑——这就是变量值为完整元素时能通过、子串时失败的原因。
如果要实现变量传递子串的包含校验,需要改用脚本化的匹配方式,示例如下:
* set test.input.data = 'test' * def listData = ["testcoding", "testcoding", "testcoding"] * def expectedSub = test.input.data * match each listData contains '#? _.includes(expectedSub)'
内容的提问来源于stack exchange,提问作者Depstan Xavier
相关产品推荐
相关产品推荐

