Karate框架match与schema shortcuts功能异常问题咨询
Karate框架match与schema shortcuts功能异常问题
测试代码
Feature: Scenario: * configure continueOnStepFailure = true * def sampleResponse = """ { account: "123456", name: "sampletest", location: { locationId: "MyTown", latitude: "", longitude: "", timeZoneId: "America/Chicago" } } """ * def location1 = sampleResponse.location * def sampleResponse2 = """ { location: { locationId: "MyTown", timeZoneId: "America/Chicago" } } """ * def location2 = sampleResponse2.location * print 'location1.latitude is:__',location1.latitude * print 'location2.latitude is:__',location2.latitude * match location1.latitude == location2.latitude * match location2.latitude == '#null' * match location2.latitude == '#string' * match location2.latitude == '#notpresent' * def loc2Value = location2.latitude == '#notpresent' ? 'missing' : 'valid' * print 'loc2Value is:__',loc2Value
异常现象
- 打印不存在的
location2.latitude时输出为null:14:58:32.705 [print] location2.latitude is:__ null - 输出为null,但
match location2.latitude == '#null'执行失败 match location2.latitude == '#string'在值为null的情况下仍执行通过- 三元表达式判断
location2.latitude == '#notpresent'时,输出结果为valid,与预期逻辑不符
问题解析与修复方案
1. 访问不存在字段返回null的原因
Karate基于JavaScript引擎,访问对象不存在的属性时会返回null而非报错,这是语言特性导致的正常行为。
2. match断言的正确用法
#nullvs#notpresent:#null用于匹配已存在但值为null的字段,而location2.latitude是不存在的字段,直接断言location2.latitude == '#null'会失败。验证字段不存在需针对父对象操作:// 方式1:在父对象结构中指定字段不存在 * match location2 == { locationId: '#string', timeZoneId: '#string', latitude: '#notpresent' } // 方式2:用contains key判断 * match not location2 contains key 'latitude'#string的宽松匹配:Karate的#stringshortcut默认允许null值,若需严格匹配非空字符串,需组合#present使用:* match location1.latitude == '#present #string'
3. 三元表达式判断字段存在性的正确方式
#notpresent是Karate断言专属关键字,不能在普通表达式中直接使用。判断字段是否存在需用内置的karate.containsKey()函数:
* def loc2Value = karate.containsKey(location2, 'latitude') ? 'valid' : 'missing'
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

