Java 1.8+JMeter5.4运行Groovy脚本报错:无法解析JsonSlurper类
在JMeter 5.4 + Java 1.8环境下解决Groovy脚本JsonSlurper无法解析的问题
问题场景
测试计划中使用的Groovy脚本在JMeter 5.5 + Java 17环境运行正常,但在JMeter 5.4 + Java 1.8环境下抛出如下错误:
2023-06-16 11:34:58,180 ERROR o.a.j.e.JSR223PostProcessor: Problem in JSR223 script, StudyName_Processer javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script1.groovy: 1: unable to resolve class groovy.json.JsonSlurper
原脚本内容:
import groovy.json.JsonSlurper; def completeFetchedStudyNameFromResponse = []; 1.upto(vars.get('studyNameFetched_matchNr') as int, { index -> completeFetchedStudyNameFromResponse.add(vars.get('studyNameFetched_' + index)); }); String tempToBeExcludedStudyName = vars.get('excludeStudyName'); def toBeDeleteStudy = []; def studyNameNeedToExcludeFromDeletion = new JsonSlurper().parseText(tempToBeExcludedStudyName); def filteredStudyName = completeFetchedStudyNameFromResponse.findAll { studyName -> studyNameNeedToExcludeFromDeletion.every { keywords -> studyName.contains(keywords) } } def bdConverter = new JsonSlurper(); def responseBDTemp = prev.getResponseDataAsString(); def responseBD = bdConverter.parseText(responseBDTemp); def resultStudyUUIDCollector = []; def parsedResultBD = responseBD.accounts; filteredStudyName.each { studyNameFew -> resultStudyUUIDCollector.add(responseBD.accounts.find { account -> account.name == studyNameFew }.uuid) } vars.putObject("myList", resultStudyUUIDCollector);
不升级环境的解决方案
方案一:改用JMeter内置的JSON库(无需额外依赖)
JMeter 5.4默认包含org.json Java原生JSON库,直接替换脚本中的JsonSlurper逻辑即可:
修改后的完整脚本:
def completeFetchedStudyNameFromResponse = []; 1.upto(vars.get('studyNameFetched_matchNr') as int, { index -> completeFetchedStudyNameFromResponse.add(vars.get('studyNameFetched_' + index)); }); String tempToBeExcludedStudyName = vars.get('excludeStudyName'); // 改用org.json解析排除列表 def studyNameNeedToExcludeFromDeletion = new org.json.JSONArray(tempToBeExcludedStudyName); def excludeKeywords = [] for (int i = 0; i < studyNameNeedToExcludeFromDeletion.length(); i++) { excludeKeywords.add(studyNameNeedToExcludeFromDeletion.getString(i)) } // 过滤需要保留的研究名称 def filteredStudyName = completeFetchedStudyNameFromResponse.findAll { studyName -> excludeKeywords.every { keyword -> studyName.contains(keyword) } } // 改用org.json解析响应数据 def responseBDTemp = prev.getResponseDataAsString(); def responseBD = new org.json.JSONObject(responseBDTemp); def parsedResultBD = responseBD.getJSONArray("accounts"); def resultStudyUUIDCollector = []; // 收集匹配的UUID filteredStudyName.each { studyNameFew -> for (int i = 0; i < parsedResultBD.length(); i++) { def account = parsedResultBD.getJSONObject(i); if (account.getString("name").equals(studyNameFew)) { resultStudyUUIDCollector.add(account.getString("uuid")); break; } } } vars.putObject("myList", resultStudyUUIDCollector);
方案二:补充Groovy JSON依赖包
- 下载与JMeter 5.4自带Groovy版本匹配的
groovy-jsonjar包(JMeter 5.4内置Groovy版本为2.4.17,对应下载groovy-json-2.4.17.jar) - 将下载的jar包放入JMeter安装目录下的
lib文件夹 - 重启JMeter,原脚本即可正常运行
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

