【问题标题】:jmeter Beanshell - Error invoking bsh method: evaljmeter Beanshell - 调用 bsh 方法时出错:eval
【发布时间】:2017-04-26 15:30:15
【问题描述】:

我正在尝试从同一线程组中的 3 个不同 HTTP 请求中打印 3 个变量。 我在 Jmeter 中写了以下 BeanShell:

try {
    hash1 = vars.get("var_Hash_1");
    hash2 = vars.get("var_Hash_2");
    hash3 = vars.get("var_Hash_3");
    FileWriter fstream = new FileWriter("/tmp/result.txt",true);
    BufferedWriter out = new BufferedWriter(fstream);
    out.write(hash1);
    out.write(",");
    out.write(hash2);
    out.write(",");
    out.write(hash3);
    out.write(",");
    out.write("\n");
    out.close();
    fstream.close();
}
catch (Throwable e) {
    log.error("Errror in Beanshell", e);
    throw e;
}

例外是:

2017/04/26 16:16:25 警告 - jmeter.extractor.BeanShellPostProcessor:BeanShell 脚本 org.apache.jorphan.util.JMeterException 中的问题:调用 bsh 方法时出错:eval 源文件:内联评估:``try { hash1 = vars.get("var_Hash_1"); hash2 = vars.get("var_Hash_2");哈希3 = va 。 . . '' : 目标错误

有趣的是,如果我尝试只写入 hash1 和 hash2,则会发生相同的异常,但是会在 result.txt 文件中写入一些内容(hash1,hash2) hash1,hash2,hash3 什么都没有写出来。

当我执行 3 个类似的请求并且它们成功时,所有 3 个变量都应该存在。有什么想法吗?

已编辑:来自异常的日志文件:

2017/04/26 17:30:29 ERROR - jmeter.util.BeanShellTestElement: Errror in Beanshell java.lang.NullPointerException
        at java.io.Writer.write(Writer.java:127)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at bsh.Reflect.invokeMethod(Reflect.java:134)
        at bsh.Reflect.invokeObjectMethod(Reflect.java:80)
        at bsh.Name.invokeMethod(Name.java:858)
        at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75)
        at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
        at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
        at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
        at bsh.BSHBlock.eval(BSHBlock.java:80)
        at bsh.BSHBlock.eval(BSHBlock.java:46)
        at bsh.BSHTryStatement.eval(BSHTryStatement.java:86)
        at bsh.Interpreter.eval(Interpreter.java:645)
        at bsh.Interpreter.eval(Interpreter.java:739)
        at bsh.Interpreter.eval(Interpreter.java:728)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.apache.jmeter.util.BeanShellInterpreter.bshInvoke(BeanShellInterpreter.java:170)
        at org.apache.jmeter.util.BeanShellInterpreter.eval(BeanShellInterpreter.java:197)
        at org.apache.jmeter.util.BeanShellTestElement.processFileOrScript(BeanShellTestElement.java:151)
        at org.apache.jmeter.extractor.BeanShellPostProcessor.process(BeanShellPostProcessor.java:64)
        at org.apache.jmeter.threads.JMeterThread.runPostProcessors(JMeterThread.java:750)
        at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:452)
        at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
        at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 我执行了你的代码,看来我可以将值写入文件。我只更改了这一行FileWriter fstream = new FileWriter("C:/Projects/result.txt",true);

标签: variables jmeter beanshell


【解决方案1】:

这里的问题是您在同一个采样器上使用了两个后处理器,它们的执行顺序错误。我想你有类似的东西:

  • 取样器 1
    • 正则表达式/Beanshell 提取器
  • 取样器 2
    • 正则表达式/Beanshell 提取器
  • 取样器 3
    • Beanshell 后处理器
    • 正则表达式/Beanshell 提取器

在第三个采样器上,带有您提供的脚本的 beanshell 正在尝试访问尚未初始化的变量。

要解决此问题,您需要将 beanshell 后处理器移动到 Regex/Beanshell 提取器下方将您的脚本移动到放置在 Sampler 3 之后的新 Beanshell Sampler。

有关元素执行顺序的更多信息,请参阅this link

【讨论】:

  • 嗨,Ivan,虽然这可能是造成这种情况的原因,但我的正则表达式提取器/beanshell 后处理器从一开始就按正确的顺序进行
  • 我已尝试根据我的回答进行设置。在我翻转 Beanshell 和 Regex 之前,它不起作用。您是否尝试过第二个选项(将脚本放入 Beanshell Sampler 波纹管采样器)?
【解决方案2】:

鉴于您已经有了 try 块 - 查看“正常”堆栈跟踪的 jmeter.log 文件,这个 Error invoking bsh method: eval 废话没有说明根本原因。如果您自己无法解决问题,请发布以Errror in Beanshell 开头的日志部分,直到此处结束。

我可以假设两个可能的原因:

  1. 您的一个变量由于是null(很可能)而未设置,请通过将Debug Sampler 放在Beanshell 测试元素之前检查变量值并仔细检查View Results Tree 侦听器中的变量值。
  2. 您没有/tmp/result.txt 文件的写入权限(不太可能但也可能)

其他几个建议:

  1. 存储 JMeter 变量值的最佳方法是使用 Sample Variables 属性
  2. 如果您必须编写脚本,请使用JSR223 Test Elements and Groovy language 而不是 Beanshell。

【讨论】:

  • 感谢 Dmitri,看起来变量 hash3 是空的,这就是根本原因。我有 3 个几乎相同的 HTTP 采样器,如果将 beanshell 脚本放在线程组的末尾,我可以从 sampler1 和 sampler2 访问变量。由于未知原因,我无法从 sampler3 访问变量。如果我在每个示例中分别放置 3 个不同的脚本而不更改任何其他内容,我也不例外,我能够打印所有 3 个变量。
  • 所以看起来 Sampler1 和 Sampler2 在同一范围内,但 Sampler3 不在。我不明白为什么,因为它们都在同一个线程组中
【解决方案3】:

通过添加调试采样器或在 beanshell 脚本中使用以下代码来检查值,以确保您获得所有值

 log.info("Hash1 value :"+hash1);

 log.info("Hash2 value :"+hash2);

 log.info("Hash3 value :"+hash3);

如果不是,请检查正则表达式提取器的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多