jmeter Beanshell - 调用bsh方法时出错:eval

时间:2017-04-26 15:30:15

标签: variables jmeter beanshell

我正在尝试从同一个线程组中的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 WARN - jmeter.extractor.BeanShellPostProcessor:BeanShell脚本中的问题org.apache.jorphan.util.JMeterException:调用bsh方法时出错:eval          源文件:内联评估:``try {hash1 = vars.get(“var_Hash_1”); hash2 = vars.get(“var_Hash_2”); hash3 = va。 。 。 '':TargetError

什么是有趣的是,如果我尝试只写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)

3 个答案:

答案 0 :(得分:1)

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

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

  1. 由于null(最有可能)而未设置其中一个变量,请在Beanshell测试元素之前放置Debug Sampler来检查变量值,并仔细检查{{3}中的变量值听众。
  2. 您没有/tmp/result.txt文件的写入权限(不太可能但也可能)
  3. 其他一些建议:

    1. 存储JMeter变量值的最佳方法是使用View Results Tree属性
    2. 如果您必须使用Sample Variables代替Beanshell编写脚本。

答案 1 :(得分:1)

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

  
      
  • 采样器1      
        
    • Regex / Beanshell提取器
    •   
  •   
  • 采样器2      
        
    • Regex / Beanshell提取器
    •   
  •   
  • 采样器3      
        
    • Beanshell post processor
    •   
    • Regex / Beanshell提取器
    •   
  •   

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

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

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

答案 2 :(得分:0)

通过添加debug sampler或在beanshell脚本中使用以下代码来检查值,以确保获得所有值

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

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

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

如果没有,则检查正则表达式提取器的顺序。