我有一個BeanShell
PostProcessor
其開頭:的JMeter的BeanShell PostProcessor中試圖將一個字符串作爲字節[]
result = ctx.getPreviousResult();
String data = result.getResponseDataAsString();
在一個LoopController
的第二個循環,它會在日誌中給出這樣的:
ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String
WARN - jmeter.extractor.BeanShellPostProcessor: Problem in BeanShell script org.apache.jorphan.util.JMeterException: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String
但是,如果我刪除String
聲明,我沒有(因此使用此解決)......即是模棱兩可的類型)得到警告:
data = result.getResponseDataAsString();
如果在此行之前打印result.getResponseDataAsString().getClass().getName()
,我會得到java.lang.String
。
在JMeter中使用的相當新的BeanShell
,但非常確定該行是問題所在。
同時,如果我在String data = ...
賦值之前有log.info
語句,它們將不會在第二個循環迭代中打印 - 這讓我質疑該評估。
如何理解/更正嘗試的byte[]
作業?
參考:這裏是我的測試計劃:
基本上,每個採樣使用result.getResponseDataAsString()
獲得響應的身體,做一些操作,以「規範化」,然後設置通過vars.put()
的值。 BeanShell Assertion
使用vars.get()
來檢索這兩個值,並相應地將它們與集合FailureMessage
和Failure
進行比較。
注意:兩個PostProcessor
都有同樣的問題。
注2:String data = new String(result.getResponseData());
同樣是有問題的(即相同的錯誤)......不是,我會永遠倡導創建從一個byte[]
沒有String
被明確有關編碼/字符集。
我試過你的代碼,並沒有得到任何錯誤。雖然你不需要'ctx',你可以直接使用'prev.getResponseDataAsString()'。 因此,無論您的響應是真正的二進制還是...試試這個:使用代碼創建一個BeanShell採樣器:'SampleResult.setResponseData(「Hello」);'並將您的後處理器放在該採樣器下。它是否會返回相同的錯誤?如果不是,這意味着你的具體數據肯定是一些東西。如果是的話,你需要看看你的環境... –
感謝您對'prev'的建議。另外,我用你的BeanShell取樣器的想法來構建我的答案中提到的小型.JMX。你有助於我發現自己的錯誤。 –