2016-08-12 206 views
1

我有一個BeanShellPostProcessor其開頭:的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[]作業?

參考:這裏是我的測試計劃:

enter image description here

基本上,每個採樣使用result.getResponseDataAsString()獲得響應的身體,做一些操作,以「規範化」,然後設置通過vars.put()的值。 BeanShell Assertion使用vars.get()來檢索這兩個值,並相應地將它們與集合FailureMessageFailure進行比較。

注意:兩個PostProcessor都有同樣的問題。

注2:String data = new String(result.getResponseData());同樣是有問題的(即相同的錯誤)......不是,我會永遠倡導創建從一個byte[]沒有String被明確有關編碼/字符集。

+2

我試過你的代碼,並沒有得到任何錯誤。雖然你不需要'ctx',你可以直接使用'prev.getResponseDataAsString()'。 因此,無論您的響應是真正的二進制還是...試試這個:使用代碼創建一個BeanShell採樣器:'SampleResult.setResponseData(「Hello」);'並將您的後處理器放在該採樣器下。它是否會返回相同的錯誤?如果不是,這意味着你的具體數據肯定是一些東西。如果是的話,你需要看看你的環境... –

+0

感謝您對'prev'的建議。另外,我用你的BeanShell取樣器的想法來構建我的答案中提到的小型.JMX。你有助於我發現自己的錯誤。 –

回答

2

我創建了一個小的.jmx併成功重新創建了該問題。

我找到了在JMeter的代碼(JMeter的3.0,org.apache.jmeter.extractor.BeanShellPostProcessor:63特定行:

bshInterpreter.set("data", prev.getResponseData());//$NON-NLS-1$ 

那放倒我了......我有一個名爲在上面後處理器data VAR

又看了@ JMeter的用戶界面和......果然,data是一個預先定義的腳本VAR,(每以上線)類型爲byte[]

我假設的BeanShell管理的byte[] <--> String當我的var沒有用String聲明時進行投射。通過嚴格的String聲明,類型混淆已創建。

解決重命名我的腳本VAR到:

String localResponseData = result.getResponseDataAsString(); 

教訓:別姓豆殼變量data(或其它任何預先定義的一個)!

+0

Woow,很棒的發現:)我花了30分鐘試圖找出爲什麼我的JMeter後處理任務不能使用數據變量名稱。 – Boris

+1

當然,我們可以通過關注用戶界面上定義的變量名稱列表來節省很多麻煩: - \ –

相關問題