JMeter中JSR223 Sampler的Groovy脚本文件声明报错
处理JMeter JSR223 Sampler文件上传脚本的语法错误
原Groovy脚本
import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClientBuilder; def imageFileName = "C:\\Users\\IMAGES\\IMG00001.dcm" def urlRequest='https://<app-server>/api/v3/storage/namespace/7c762733-009f-4527-81ea-571d1cf6e9d2/image?sid=${SIDVALUE}&study_uid=1.2.300.0.7230010.3.1.2.2595064201.8112.1216202112026121&image_uid=1.2.840.113704.7.1.0.1356918323635126.1521373008.110' def postRequest = new HttpPost(urlRequest); def file = new File(imageFileName); def builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, imageFileName); def entity = builder.build(); post.setEntity(entity); def response = HttpClientBuilder.create().build().execute(postRequestt);
报错信息
2022-09-01 13:44:03,501 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script44.groovy: 8: Unexpected input: '"' @ line 8, column 21. def imageFileName = "C:\Users\IMAGES\IMG00001.dcm" ^ 1 error javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script44.groovy: 8: Unexpected input: '"' @ line 8, column 21. def imageFileName = "C:\Users\IMAGES\IMG00001.dcm" ^ 1 error at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.compile(GroovyScriptEngineImpl.java:183) ~[groovy-jsr223-3.0.3.jar:3.0.3] at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:216) ~[ApacheJMeter_core.jar:5.3] at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:72) [ApacheJMeter_java.jar:5.3] at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:630) [ApacheJMeter_core.jar:5.3] at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) [ApacheJMeter_core.jar:5.3] at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) [ApacheJMeter_core.jar:5.3] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) [ApacheJMeter_core.jar:5.3] at java.lang.Thread.run(Unknown Source) [?:1.8.0_191] Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script44.groovy: 8: Unexpected input: '"' @ line 8, column 21. def imageFileName = "C:\Users\IMAGES\IMG00001.dcm" ^ 1 error at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:287) ~[groovy-3.0.3.jar:3.0.3] at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:143) ~[groovy-3.0.3.jar:3.0.3] at org.apache.groovy.parser.antlr4.AstBuilder.collectSyntaxError(AstBuilder.java:4544) ~[groovy-3.0.3.jar:3.0.3] at org.apache.groovy.parser.antlr4.AstBuilder.access$000(AstBuilder.java:341) ~[groovy-3.0.3.jar:3.0.3] at org.apache.groovy.parser.antlr4.AstBuilder$1.syntaxError(AstBuilder.java:4559) ~[groovy-3.0.3.jar:3.0.3]
已尝试操作
- 将文件路径从
C:\\Users\\IMAGES\\IMG00001.dcm改为C:\Users\IMAGES\IMG00001.dcm,问题未解决
解决方案
1. 替换HTML转义字符
脚本中的"是HTML转义的双引号,Groovy无法识别,必须替换为普通双引号"。
2. 修正变量名错误
脚本存在两处变量名拼写错误:
post.setEntity(entity);应改为postRequest.setEntity(entity);(变量定义为postRequest,不是post)execute(postRequestt);应改为execute(postRequest);(多了一个t)
3. 正确处理Windows文件路径
Windows路径有两种合法写法,任选其一即可:
- 双反斜杠:
C:\\Users\\IMAGES\\IMG00001.dcm(需要转义) - 正斜杠:
C:/Users/IMAGES/IMG00001.dcm(无需转义,推荐使用)
4. 正确引用JMeter变量
URL中的${SIDVALUE}如果是JMeter定义的变量,Groovy中需要通过vars.get("SIDVALUE")获取,否则会被当作字符串字面量传递。
修正后的完整脚本
import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClientBuilder; // 使用双反斜杠或正斜杠的Windows路径 def imageFileName = "C:\\Users\\IMAGES\\IMG00001.dcm" // def imageFileName = "C:/Users/IMAGES/IMG00001.dcm" // 获取JMeter中的SIDVALUE变量 def sidValue = vars.get("SIDVALUE") def urlRequest = "https://<app-server>/api/v3/storage/namespace/7c762733-009f-4527-81ea-571d1cf6e9d2/image?sid=${sidValue}&study_uid=1.2.300.0.7230010.3.1.2.2595064201.8112.1216202112026121&image_uid=1.2.840.113704.7.1.0.1356918323635126.1521373008.110" def postRequest = new HttpPost(urlRequest); def file = new File(imageFileName); def builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, imageFileName); def entity = builder.build(); // 修正变量名post为postRequest postRequest.setEntity(entity); // 修正变量名postRequestt为postRequest def response = HttpClientBuilder.create().build().execute(postRequest); // 可选:打印响应状态码,验证请求结果 log.info("请求响应状态码:" + response.getStatusLine().getStatusCode())
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

