2017-04-26 74 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); 

如果沒有則檢查你的正則表達式提取的順序。

相關問題