JMeter中使用Groovy实现响应关联及修复数据提取异常问题
JMeter Groovy 接口关联正则失效修复
问题原因
你的正则提取代码无法运行的核心问题:
- 经
JsonSlurper解析后的data是Groovy原生结构化对象(JSON对象对应LinkedHashMap、JSON数组对应ArrayList),并非字符串类型,正则匹配仅支持对字符串执行操作,直接对结构化对象使用=~匹配运算符会触发类型错误。 - 退一步说,就算Groovy隐式调用对象的
toString()方法完成类型转换,对解析完成的结构化对象再转字符串用正则取值,属于完全冗余的操作,容错率极低,字段顺序、嵌套层级变动都会导致匹配失败。
正确实现方式(推荐)
直接通过Groovy对象的属性访问语法按路径取值,是性能最高、稳定性最好的方案,完全不需要正则:
import groovy.json.JsonOutput // 直接按JSON结构的key路径取值,示例取accountDetails字段内容 def accountDetails = data.accountDetails // 如果需要取数组内指定字段,比如取第一个账户的账号,写法参考: // def targetAccountNum = data.accountDetails[0].accountNo // 存到变量供后续调用,如果后续需要传JSON格式字符串,建议转成标准JSON存储 vars.put("accountDetailsStr", JsonOutput.toJson(accountDetails)) // 如果确实要存对象类型,用putObject vars.putObject('matches', accountDetails)
正则兼容写法(不推荐,仅做问题修复参考)
如果一定要用正则匹配,必须先把结构化对象转为字符串再执行匹配,修复后代码如下:
import java.util.regex.* // 先将对象转为字符串,这里用Groovy对象默认toString格式匹配你写的正则规则 String dataStr = data.toString() def matcher = (dataStr =~ /accountDetails=\[(.*)\],/) def matches = null if (matcher.find()) { matches = matcher.group(1) } vars.putObject('matches', matches)
注意:该写法依赖Groovy对象toString()的输出格式,只要接口返回结构变动、字段顺序调整,就会出现匹配失效,正式压测/业务场景禁止使用。
内容的提问来源于stack exchange,提问作者Yazhu
相关产品推荐
相关产品推荐

