最近使用jmeter測試webSocket 發(fā)現(xiàn)一次數(shù)據(jù)超過1024后,數(shù)據(jù)會(huì)被拆分成兩段,導(dǎo)致業(yè)務(wù)數(shù)據(jù)提取和斷言失敗,本來以為配置下就可以,經(jīng)過查找發(fā)現(xiàn),作者最終給出方案只能用戶自己處理,具體如下:(直接引用 傳送地址)
下方是谷歌翻譯:
WebSocket 消息可能被分成幾個(gè)幀。在這種情況下,第一幀是普通文本或二進(jìn)制幀,但它會(huì)清除該final
位。后續(xù)幀將是連續(xù)幀(無論它們是文本還是二進(jìn)制由第一幀推斷)并且最后一個(gè)連續(xù)幀將設(shè)置位final
。該插件支持連續(xù)幀,但由于該插件是面向幀的,因此您必須自己閱讀它們。在片段數(shù)量事先已知的情況下,這就像為您期望的每個(gè)延續(xù)幀添加一個(gè)額外的 WebSocketReadSampler 一樣簡單。如果不知道連續(xù)幀的數(shù)量,則需要?jiǎng)?chuàng)建一個(gè)循環(huán)來讀取所有連續(xù)幀。為此,該插件提供了一個(gè)新的 JMeter 變量,稱為websocket.last_frame_final
表示最后讀取的幀是否是最終的。這使您能夠使用標(biāo)準(zhǔn)的 JMeter While 控制器編寫一個(gè)簡單的循環(huán);使用表達(dá)式${__javaScript(! ${websocket.last_frame_final},)}
作為條件。使用 JMeter If Controller,可以簡化條件,! ${websocket.last_frame_final}
因?yàn)樵摽刂破鲿?huì)自動(dòng)將條件解釋為 JavaScript。有關(guān)使用 While 或 If 控制器讀取連續(xù)幀的示例,請參閱示例Read continuation frames.jmx測試計(jì)劃。
如果您不確定您的服務(wù)器是否發(fā)送了連續(xù)幀或發(fā)送了多少,請打開調(diào)試日志記錄:讀取幀的采樣器將記錄接收到的幀是否是“正常”單幀、非最終幀(即第一個(gè)片段),一個(gè)延續(xù)幀或一個(gè)最終的延續(xù)幀(最后一個(gè)片段)。
總結(jié):
通過上述可以看出,作者提供了一個(gè)websocket.last_frame_final變量,用戶只能通過這個(gè)變量獲取上傳的websocket是否是連續(xù)且未接收完成的幀,如果沒有接收完成,通過if 或while進(jìn)行后續(xù)處理:
總的設(shè)計(jì)思路:
1.分三步處理:
2.第一步接收:使用后置處理判斷是否一次完成,如果沒有這臨時(shí)存儲(chǔ)
//heart-1 后置處理器
String websocket_last_frame_final = vars.get("websocket.last_frame_final");
log.info("1111end="+websocket_last_frame_final);
rs = prev.getResponseDataAsString();
log.info("rs111111="+rs);
if("true".equals(websocket_last_frame_final)){
vars.put("rs",rs);
}else{
vars.put("ws_data_last",rs);
}
3.第二步后續(xù)處理:如果沒有完成進(jìn)入第二步,并進(jìn)行拼接(我此處用的if因?yàn)槲抑?次足夠,正常不知道情況下應(yīng)該用while)
//heart-2 后置處理器
// read second frame
String websocket_last_frame_final = vars.get("websocket.last_frame_final");
rs = prev.getResponseDataAsString();
log.info("rs22222="+rs);
ws_data_last = vars.get("ws_data_last");
//log.info("ws_data_last1="+ws_data_last);
if ("true".equals(websocket_last_frame_final)){
vars.put("rs",ws_data_last + rs);
}
4.最后一步處理:將之前的結(jié)果合并成一個(gè),并設(shè)置給beanshell取樣器響應(yīng)結(jié)果,方便使用提取和斷言處理(我這是個(gè)json,合起來用json提取器更方便)
//合并-心跳-接收ws推送的消息
log.info("rs="+vars.get("rs"));
//prev.setResponseData(vars.get("rs"));
SampleResult.setResponseData(vars.get("rs"));
SampleResult.setDataType(org.apache.jmeter.samplers.SampleResult.TEXT);