问题 JMeter / Beanshell“调用bsh方法时出错:eval源文件:”


我在JMeter中遇到问题,我收到此错误

2014/08/14 14:13:26 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval   Sourced file: inline evaluation of: ``String RequestUrl = vars.get("RequestUrl"); String[] params = RequestUrl.split(" . . . '' : Typed variable declaration 
2014/08/14 14:13:26 WARN  - jmeter.extractor.BeanShellPostProcessor: Problem in BeanShell script org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval   Sourced file: inline evaluation of: ``String RequestUrl = vars.get("RequestUrl"); String[] params = RequestUrl.split(" . . . '' : Typed variable declaration 

我不知道什么是错的,否则代码似乎正在起作用。有人能给我一些建议吗?

这是有问题的代码块:

String RequestUrl = vars.get("RequestUrl");
String[] params = RequestUrl.split("\\?");
String RequestTask = params[1].split("\\&")[1].split("=")[1];
System.out.println(RequestTask);
vars.put("RequestTask",RequestTask);

应该提到代码是在后处理器中,它与“RequestUrl”的Xpath提取器配对

编辑包括整个错误


3231
2017-08-14 17:34


起源



答案:


我没有看到你的URL以及XPath查询返回的内容,但无论如何你的URL解析逻辑看起来很脆弱,因为它强烈依赖于参数的顺序和存在,并且在将来请求URL更改时可能会让你反感,即额外参数或更改参数顺序或编码的东西等

见下文供参考:

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import java.net.URI;
import java.util.List;

String url = vars.get("RequestUrl");

List params = URLEncodedUtils.parse(new URI(url), "UTF-8");

for (NameValuePair param : params) {            
    if (param.getName().equals("put your actual param name here")) {                 
        vars.put("RequestTask", param.getValue());
    }
}

还值得一试 如何使用BeanShell:JMeter最喜欢的内置组件 用于故障排除提示通常,应该使用本地化错误日志记录,如:

log.info("something");
log.error("something else");

因此,如果您没有在日志中看到消息,那么Beanshell无法执行该行并在上面的某处失败。

此外,Beanshell错误消息的信息量不大,我在脚本中使用以下构造:

try {
    //script logic here
}

catch (Throwable ex) {
    log.error("Failed to do this or that", ex);
}

因此可以在jmeter.log文件中读取错误stracktrace。

希望这可以帮助。


14
2017-08-16 10:56



是的,这非常有帮助!唯一的另一个问题是,我如何从这个后处理器附加的http请求中获取原始URL?(以便我可以将它分配给RequestURL)我不确定是否使用XPath查询提取器,或者RegEx提取器..但无论哪种方式,我还没有成功提取任何类型的网址 - sidd
这很简单 prev.getURL() 获取java.net.URL实例或 prev.getURL().toString() 用于字符串表示。 - Dmitri T
建议的调试提示有很多帮助。谢谢。 - Sanjeev Kumar Dangi


答案:


我没有看到你的URL以及XPath查询返回的内容,但无论如何你的URL解析逻辑看起来很脆弱,因为它强烈依赖于参数的顺序和存在,并且在将来请求URL更改时可能会让你反感,即额外参数或更改参数顺序或编码的东西等

见下文供参考:

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import java.net.URI;
import java.util.List;

String url = vars.get("RequestUrl");

List params = URLEncodedUtils.parse(new URI(url), "UTF-8");

for (NameValuePair param : params) {            
    if (param.getName().equals("put your actual param name here")) {                 
        vars.put("RequestTask", param.getValue());
    }
}

还值得一试 如何使用BeanShell:JMeter最喜欢的内置组件 用于故障排除提示通常,应该使用本地化错误日志记录,如:

log.info("something");
log.error("something else");

因此,如果您没有在日志中看到消息,那么Beanshell无法执行该行并在上面的某处失败。

此外,Beanshell错误消息的信息量不大,我在脚本中使用以下构造:

try {
    //script logic here
}

catch (Throwable ex) {
    log.error("Failed to do this or that", ex);
}

因此可以在jmeter.log文件中读取错误stracktrace。

希望这可以帮助。


14
2017-08-16 10:56



是的,这非常有帮助!唯一的另一个问题是,我如何从这个后处理器附加的http请求中获取原始URL?(以便我可以将它分配给RequestURL)我不确定是否使用XPath查询提取器,或者RegEx提取器..但无论哪种方式,我还没有成功提取任何类型的网址 - sidd
这很简单 prev.getURL() 获取java.net.URL实例或 prev.getURL().toString() 用于字符串表示。 - Dmitri T
建议的调试提示有很多帮助。谢谢。 - Sanjeev Kumar Dangi


你能表现出整个错误吗?

尝试在另一个之后添加一个语句,以查看哪个是根本原因。

我想你可能会对可能导致问题的结果(数组访问)做出假设。


0
2017-08-14 18:50



编辑以添加整个错误 - sidd
没有更多信息,请尝试遵循我的建议并显示中间结果 - UBIK LOAD PACK
我不完全确定你的意思是什么意思。每行都依赖于它运行之前的行,所以我不能在不破坏它的情况下添加一个语句 - sidd
不,我的意思是,保持第一行并评论其他一切,然后取消评论第二行(所以只有第1和第2行没有评论...... - UBIK LOAD PACK
原来如此。无论如何,我已将其缩小到XPath Extractor。我认为它只是归结为查询的错误路径。将随着进展而更新 - sidd


如果你将VuGen录制的JMS脚本转换为JMeter,那么你必须寻找 lr 复制的函数将抛出此/类似错误。

例如: int orderlinecount = Integer.parseInt(lr.eval_string("strInt"));

您必须确保您的脚本没有所有与lr相关的函数,以便jmeter成功执行您的脚本。


0
2017-09-05 11:28