Jmeter JSR223预处理器读取外部CSV文件报错求助
解决JMeter中JSR223预处理器Groovy脚本解析错误问题
问题概述
需求为从外部CSV文件读取ItemID并传入JSR223预处理器,本地Groovy执行器中可运行的脚本在JMeter中执行时抛出解析错误,环境配置为Java 19.0.1、JMeter 5.4.3、Groovy 4.0.2。
原脚本(本地可运行)
def items = [] List<String> lines = new File("C:\Users\854986\itemid.csv").readLines() def itemNo = RandomUtils.nextInt(5, 10) 1.upto(itemNo) { index -> def item = [:] def lineFromCsv = lines.get(index as int) item.put('itemId', lineFromCsv)
报错信息
2022-11-15 12:34:14,398 ERROR o.a.j.m.JSR223PreProcessor: Problem in JSR223 script, JSR223 PreProcessor 3
javax.script.ScriptException: org.apache.commons.jexl2.JexlException$Parsing: JsonBuilder@1:20 parsing error near '... ment, miss ...'
at org.apache.commons.jexl2.scripting.JexlScriptEngine.compile(JexlScriptEngine.java:237)
报错原因
- 脚本引擎不匹配:JMeter默认可能使用JEXL2引擎执行脚本,而非Groovy引擎,JEXL2不兼容Groovy语法导致解析失败。
- 脚本语法不完整:原脚本存在未闭合的循环代码,且未将创建的
item对象添加到items列表中。 - 路径转义错误:Windows路径中的反斜杠未转义,会被解析为特殊字符,导致文件路径无效。
- 索引越界风险:随机生成的
itemNo可能超过CSV文件的行数,引发索引越界异常。
修复方案
1. 指定Groovy脚本引擎
在JSR223预处理器的配置界面:
- 选择Language为
groovy(默认可能是jexl2,需手动切换) - 勾选Cache compiled script if available,提升脚本执行性能
2. 修正Groovy脚本
以下是完整修复后的脚本:
import org.apache.commons.lang3.RandomUtils def items = [] // Windows路径需转义反斜杠,或使用正斜杠替代 def csvFile = new File("C:\\Users\\854986\\itemid.csv") List<String> lines = csvFile.readLines() // 确保随机数不超过CSV文件行数,避免索引越界 def maxCount = Math.min(10, lines.size()) def itemNo = RandomUtils.nextInt(5, maxCount) 1.upto(itemNo) { index -> def item = [:] // CSV行索引从0开始,此处index从1起始,需减1获取正确行数据 def lineFromCsv = lines.get(index - 1 as int) item.put('itemId', lineFromCsv) items.add(item) // 将item对象添加到列表中 } // 将items列表存入JMeter变量,供后续请求调用 vars.putObject("itemsList", items)
3. 验证文件访问权限
可添加日志输出验证文件是否可访问:
def csvFile = new File("C:\\Users\\854986\\itemid.csv") log.info("文件存在状态:" + csvFile.exists()) log.info("文件绝对路径:" + csvFile.getAbsolutePath())
通过JMeter的日志查看输出,确认文件路径正确且JMeter有读取权限。
内容的提问来源于stack exchange,提问作者Raxon
相关产品推荐
相关产品推荐

