2017-04-26 75 views
0

我想在同一个线程组中打印来自3个不同HTTP请求的3个变量。 我写了下面的JMeter BeanShell的:jmeter Beanshell - 错误调用bsh方法:eval

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年4月26日十六点16分25秒WARN - jmeter.extractor.BeanShellPostProcessor:问题中的BeanShell脚本组织。 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) 
+0

我执行你的代码,似乎我能够写入文件的值。我只改变了这一行'FileWriter fstream = new FileWriter(“C:/Projects/result.txt”,true);' –

回答

1

鉴于你有try块已经 - 看看jmeter.log文件为“正常”的堆栈跟踪,这Error invoking bsh method: eval废话也不说的根本原因。如果你自己无法确定问题 - 以Errror in Beanshell开始,直到最后到达日志部分。

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

  1. 你的一个变量,由于没有设置为是null(最有可能),由BeanShell的测试元件之前放置Debug Sampler检查变量的值,并仔细检查变量值在View Results Tree侦听器中。
  2. 你不必

一对夫妇的其他建议/tmp/result.txt文件的写权限(不可能的,但也有可能):

  1. 存储JMeter的变量值的最佳方法是使用Sample Variables财产
  2. 如果你必须去脚本使用JSR223 Test Elements and Groovy language而不是Beanshell。
+0

谢谢Dmitri, 看起来像变量hash3是空的,这就是根本原因。 我有3个几乎相同的HTTP采样器,如果beanshell脚本放在线程组的末尾,我可以访问sampler1和sampler2的变量。 由于未知原因,我无法从sampler3访问变量。 如果我分别在每个样本中放置3个不同的脚本而不改变其他任何东西,我没有例外,我可以打印所有3个变量。 –

+0

所以它看起来像Sampler1和Sampler2在相同的范围内,但Sampler3不在。我不明白为什么,因为他们都在同一线程组 –

0

这里的问题是,您在同一个采样器上使用两个后处理器,这些处理器按错误顺序执行。我相信你有这样的:

  • 取样机1
    • 正则表达式/ BeanShell中提取
  • 采样器2
    • 正则表达式/ BeanShell中提取
  • 山姆PLER 3
    • BeanShell的后处理器
    • 正则表达式/ BeanShell中提取

在第三采样,用您提供试图访问其尚未初始化变量脚本BeanShell的。

要解决此问题,需要移动的BeanShell后处理器波纹管正则表达式/ BeanShell中提取脚本移动到新的BeanShell取样器放入采样3.

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

+0

嗨伊凡,虽然这可能是这样的事情的原因,我有我的正则表达式提取器/豆壳后处理器从一开始的正确顺序 –

+0

我试过从我的答案安装。它不起作用,直到我翻转了Beanshell和Regex。您是否尝试过第二种选择(将脚本放入Beanshell采样器波纹管采样器中)? –

0

入住在BeanShell的脚本文件,添加调试采样或使用下面的代码值,以确保您得到的所有值

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

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

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

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

相关问题