Jmeter 修改Sampler result 結果信息
首先說一下,jmeter的Sampler result是什么?
Jmeter 的Samplers result 是jmeter在向服務器發送請求后,接收到服務器響應的基本信息的展示,如 sample 的開始請求時間、發送的內容大小、基于協議的響應狀態碼和響應消息等信息。
什么是基于協議的響應狀態碼和響應消息。比如http協議的狀態碼:200、400等,和response message:ok,這些都是http自身定義的狀態碼和消息。而接口的響應內容一般也會定義一些狀態碼或者狀態信息。不過這些是后端開發者自定義的內容,比如某個接口的響應內容中包含:{“status”:”ok”,”code”:200,response:[...]},這類信息是不會在Sample result中展示出來,而是在response data中顯示。
在sampler result 中,還記錄當前接口是否請求成功的信息,比如當請求某個接口失敗后,在結果樹中就會以紅色形式標記出來。
一般情況下,最好不要隨意修改響應結果信息,在什么情況下要修改響應結果呢?
最近在用jmeter做websocket接口連接k8s的pod對另一臺pod機進行ping超出時,如果ping 的pod存在則響應ping的結果信息。如果ping 的pod不存在時,不會響應任何信息,導致jmeter 的websocket在循環接收消息超時后,會被標記為失敗。與實際期望的結果不符。
大致的業務場景為:
PodA 存在,且開機狀態,ip地址:15.xx.1.35
PodB 存在,且開機狀態,ip地址:15.xx.1.36
PodC 存在,關機狀態, ip地址:15.xx.1.37
用例1:podA ping podB 地址正常響應ping 的信息 --【pass】
用例2:podA ping podC 地址無響應信息 --【pass】
在jmeter中用websocket 實現podA ping podC時,當長時間沒有響應信息,導致jmeter認為該請求失敗,由于websocket是長連接類型,運行不斷地請求服務信息。而且在WebSocket Single Read Sampler 中,已設置了超時不標記為錯誤。也沒有達到預期效果。

執行結果會有時候,沒有響應時,執行通過。有時候沒有響應時,執行失敗



但實際期望的結果是,ping的podC(未開機)沒有響應。是正確的
因此,需要通過干預當sampler result結果,當請求response code 報:Sampler error: unexpected frame type (ping). 時,忽略該錯誤,標記該請求為成功。
實際操作如下:
1、在WebSocket Single Read Sampler 中的后置處理器中,通過beanshell 獲取到該sample的執行結果。
2、判斷response code 等于:Sampler error: unexpected frame type (ping). 時,標記該請求成功。
實際代碼如下:
import org.apache.jmeter.samplers.SampleResult; // 獲取當前的SampleResult SampleResult sr = ctx.getPreviousResult(); // 設置新的Response Code //sr.setResponseCode("test code"); // //// 設置Response Message,如果需要的話 //sr.setResponseMessage("Read timeout, no response received"); String response_code = sr.getResponseCode(); log.info(response_code); if(response_code.equals("Sampler error: unexpected frame type (ping).")){ // 設置sample 為成功 sr.setSuccessful(true); }
最終執行結果,當出現Sampler error: unexpected frame type (ping).錯誤類型時,不會在顯示執行失敗了。


可以看到雖然,jmeter日志中顯示該請求是失敗的,但實際上已經標記為:通過了

浙公網安備 33010602011771號