SOAP UI Groovy脚本JsonNull空值判断处理问题咨询
SoapUI Groovy脚本JSON空值判断问题修复
原代码存在的核心问题
- 逻辑判断完全倒置:
if(jsonSlurper.iso8583Request.iso8583Detail.bit127)条件成立时代表字段存在且为非假有效值,原代码却在这个分支打印"127 is null",判断逻辑写反 - 基础语法错误:
try块内的if分支缺少闭合大括号,catch关键字后未声明异常接收参数,脚本会直接编译失败无法运行 - 空场景覆盖不全:既没有处理多层级属性中间节点缺失触发的空指针问题,也没有区分
null、空字符串、字段不存在三类空场景,且catch块无差别捕获所有异常就判定字段为空,容易把JSON解析错误、报文结构不匹配等其他问题误判为字段为空 - 隐式转换bug:用
"${变量}"语法做字符串插值时,如果变量值为null,会被自动转成字符串"null"存入测试用例属性,后续业务取值会拿到错误的字符串而非空值 - 真值判断漏洞:直接把字段值放在if条件里做判断,会把
0、false、空集合这类合法业务值误判为空
正确实现方案
通过安全导航操作符避免中间节点空指针,显式判断字段存在性和值有效性,去掉无意义的异常捕获做逻辑分支,代码如下:
import groovy.json.JsonSlurper // 读取请求报文 def requestMessage = context.request log.info "原始请求报文:{}", requestMessage def jsonRoot = new JsonSlurper().parseText(requestMessage) def bit127Value = null // 安全遍历多层级属性,任意一层节点不存在直接返回null,不抛空指针 def detailNode = jsonRoot?.iso8583Request?.iso8583Detail // 先判断字段是否真实存在,避免把0、false等合法值误判为空 if (detailNode?.hasProperty('bit127')) { bit127Value = detailNode.bit127 } // 统一空判断:覆盖null、空字符串、全空格字符串场景 if (bit127Value == null || bit127Value.toString().trim().isEmpty()) { log.info "bit127字段为空/不存在" } else { // 非空时手动转字符串存属性,避免GString把null转成"null"字符串 testRunner.testCase.setPropertyValue("revBit127", bit127Value.toString()) }
关键注意点
- 访问多层嵌套JSON属性时优先用安全导航操作符
?.,任意一层节点缺失时会直接返回null,不会触发空指针中断脚本 - 不要依赖Groovy的自动真值判断做非空校验,涉及数值、布尔类型字段时,必须先判断字段存在性,再单独校验空值
- 不要用无差别捕获所有异常的方式做空判断,会掩盖JSON格式错误、报文结构不符等真实问题,增加排查成本
- 往测试用例属性存值时不要直接用GString插值,手动做类型转换,避免null被自动转成字符串"null"
内容的提问来源于stack exchange,提问作者mc ser
相关产品推荐
相关产品推荐

