JMeter-SSE響應數據自動化3.0

背景

此次因為多了一些需要過濾排除的錯誤(數量很少),還需要修改下JMeter的jtl文件輸出數據(后續統計數據需要)
所以只涉及到JSR腳本的一些改動(此部分改動并不會影響到JMeter的HTML報告)

改動

主要通過設置JMeter中prev輸出數據變量threadName為appName這樣的方法,來控制jtl的數據。

prev.setThreadName(vars.get(“xxx”) + “^” + vars.get(“xxx”));

腳本如下:
具體改動可以對比自動化2.0

要注意一些響應信息自帶的換行符(\n),可能會影響到后續處理jtl文件的數據,目前用的是將\n更換為"-" 或者 “”

import org.apache.jmeter.samplers.SampleResult;
import org.json.JSONObject;
import org.json.JSONException;// 每次腳本執行前需要重置的變量
private void init(){// 添加APPID信息vars.put("APPID",vars.get("appId"));// 每次重置isExist的值,避免上次結果影響本次vars.put("isExist", "true");// 每次重置斷言輸出信息vars.put("response_type","");vars.put("error_msg", "");vars.put("actual_msg", "");// 設置threadName為appNameprev.setThreadName(vars.get("appName") + "^" + vars.get("xxx"));}// 判斷是否是流式響應
private Boolean isStreamingResponse(String response) {return response.contains("data: {");
}// 非流式響應處理,即HTTP請求錯誤處理
private void errorResponse(String response) {log.info("進入errorResponse處理!!!");    // 判斷是不是json格式的響應,first == { ? 是 : 不是response = response.replace("\n","");String first = response.substring(0,1);if("{".equals(first)) {// json格式的錯誤響應jsonErrorResponse(response);}else {// 非json格式的錯誤響應noJsonErrorResponse(response);}
}// json格式的錯誤響應處理
private void jsonErrorResponse(String response) throws Exception {JSONObject jsonResponse = new JSONObject(response);String msg = jsonResponse.get("msg");if ("智能體不存在".equals(msg)) {setAssertMsg("xxx",msg);} else {setAssertMsg("服務器錯誤",msg);}
}// 非json格式的錯誤響應處理
private void noJsonErrorResponse(String response) throws Exception {String mainMag = response.substring(0,response.indexOf("at "));setAssertMsg("服務器/其他錯誤",mainMag);}// 處理SSE響應數據,以data: 為分隔符,輸出結果到String[] 中
private String[] splitResponse(String resp) {try {return resp.split("data: ");}catch(Exception e) {log.error("拆分resp為String數組失敗!xxx:" + vars.get("appName"));}
}// 獲取event信息
private String getEvent(String resp) {try {String ret = resp.substring(resp.indexOf("\"", 8)+1, resp.indexOf("\"", 12));return ret;}catch(Exception e) {log.error("獲取event的字段內容失敗!");return "Unknow";}
}// 處理event = error 的響應
private void errorResp(String resp) {try{JSONObject jsonResponse = new JSONObject(resp);String errorMsg = jsonResponse.get("message");setAssertMsg("xxx",errorMsg);}catch(Exception e) {log.error("處理 error 響應信息失敗");}
}// 判斷有無特定target
private Boolean hasTarget(String resp) {String targetStr = vars.get("target");// 每次執行后重置target,避免影響下次target的值vars.put("target", "");return resp.contains(targetStr);
}// 斷言參數設置
private void setAssertMsg(String response_type,String error_msg){vars.put("response_type",response_type);vars.put("error_msg", error_msg);vars.put("isExist", "false");
}
private void setAssertMsg(String resp){//此方法用于無目標值的斷言參數設置//獲取answer中的信息,實際msgJSONObject jsonResp = new JSONObject(resp);String answer = jsonResp.get("data").get("outputs").optString("answer");vars.put("response_type","輸出結果與預期不符");vars.put("actual_msg", answer);vars.put("isExist", "false");
}/**正確響應結果獲取正常響應的最終結果,并設置到ResponseMessage,以供后續使用
*/
private void setTrueResp(String resp){//獲取answer中的信息,實際msgJSONObject jsonResp = new JSONObject(resp);String answer = jsonResp.get("data").get("outputs").optString("answer");String s = answer.replace("\n","-");prev.setResponseMessage(s);vars.put("isExist", "true");}// 是否需要判斷 特定target
private Boolean needCheckTarget(String resp) {if(vars.get("target") != null || !"".equals(vars.get("target"))) {// 有target,需要判斷特定targetreturn hasTarget(resp);}else {// 無需判斷特定targetreturn true;}
}// 過濾器,過濾白名單
private void filter(String resp) {try {Set<String> whiteSet = vars.getObject("whiteSet");String appId = vars.get("APPID");if(whiteSet.contains(appId)) {vars.put("isExist", "true");}else {// 非白名單errorResp(resp);}} catch (Exception e) {setAssertMsg("過濾器失效!","xxx");log.warn("過濾白名單失敗!");}
}/**每次執行后,處理變量避免下次空變量的值 受上次的影響變量:mustParam
*/
private void afterHandle(){vars.put("mustParam","");vars.put("target","");
}SampleResult prev = ctx.getPreviousResult();String response = prev.getResponseDataAsString();// 執行前重置變量
init();// 判斷是不是SSE響應
try {if (!isStreamingResponse(response)) {// 非SSE響應errorResponse(response);} else {// SSE響應// 拆分String[] respArray = splitResponse(response);// 獲取event,進行判斷String event = getEvent(respArray[respArray.length - 1]);if("message_end".equals(event)) {// 沒有錯誤,判斷 workflow_finished 響應中含有目標字段if(needCheckTarget(respArray[respArray.length - 2])){setTrueResp(respArray[respArray.length - 2]);}else {// 無目標字段,更新斷言信息setAssertMsg(respArray[respArray.length - 2]);}}else if("error".equals(event)) {// 有報錯,進入過濾器,過濾白名單filter(respArray[respArray.length - 1]);}else if("Unknow".equals(event)) {// 獲取event的字段內容失敗!setAssertMsg("xxx","xxx");}else {// 未知錯誤setAssertMsg("xxx!","xxx");}}
} catch (Exception e) {log.error("處理響應失敗!", e);setAssertMsg("xxx!","xxx");prev.setSuccessful(false);
}finally {afterHandle();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88143.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

012 進程狀態和優先級

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄 進程狀態和優先級一、進程狀態分類特殊狀態說明 二、如何查看進程…

React JSX原理

JSX本質 實質上是React.createElement()的語法糖

Java-51 深入淺出 Tomcat 手寫 Tomcat 類加載機制 雙親委派機制 生命周期 插件化

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月13日更新到&#xff1a; AI煉丹日志-28 - Aud…

從C++編程入手設計模式——責任鏈模式

從C編程入手設計模式——責任鏈模式 ? 當我們的一個請求需要多個對象去處理&#xff0c;但具體由誰來處理&#xff0c;是根據情況動態決定的。例如&#xff0c;一個日志系統中&#xff0c;可能希望把錯誤信息寫入文件&#xff0c;把提示信息輸出到控制臺&#xff0c;而不是每…

泛型方法調用需要顯示指定泛型類型的場景

泛型類型的推斷確定 一般來說&#xff0c;泛型類型的推斷可以由以下幾個場景確定&#xff1a; 變量定義指定類型 List<String> strList new ArrayList<>();ArrayList的泛型類型是依據變量的類型確定的。 方法返回值確定 Overridepublic Function<List<I…

Deep Research:開啟深度研究的智能新時代

在當今信息爆炸的時代&#xff0c;人們面臨著海量的信息&#xff0c;無論是專業人士還是普通消費者&#xff0c;都迫切需要一種高效、精準的方式來獲取和分析信息。OpenAI 推出的 Deep Research&#xff0c;宛如一顆璀璨的新星&#xff0c;在知識的海洋中為我們導航&#xff0c…

曼昆《經濟學原理》第九版 宏觀經濟學 第二十四章失業與自然失業率

以下是曼昆《經濟學原理》第九版宏觀經濟學第二十四章**“失業與自然失業率”**的詳細講解&#xff0c;從零基礎開始構建知識框架&#xff0c;結合中國實際案例與生活化比喻&#xff0c;幫助小白系統理解核心概念&#xff1a; 一、知識框架&#xff1a;失業的“全景圖” 1. 核…

【軟考高級系統架構論文】論軟件系統架構風格

論文真題 請以“軟件系統架構風格”為論題,依次從以下三個方面進行論述: 1、概要敘述你參與分析和開發的軟件系統開發項目以及你所擔任的主要工作。 2、分析軟件系統開發中常用的軟件系統架構風格有哪些?詳細闡述每種風格的具體含義。 3、詳細說明在你所參與的軟件系統開發項…

LeetCode--35.搜索插入位置

解題思路&#xff1a; 1.獲取信息&#xff1a; 給定一個升序排列的數組和一個整數&#xff0c;要求查找該整數應該在數組中插入的位置 限制條件是&#xff0c;要求時間復雜度為O(log N) 2.分析題目&#xff1a; 時間復雜度要求O(log N)&#xff0c;那么就使用二分查找法&#x…

Unix、Linux、POSIX、Minix 區別與聯系

一、Unix&#xff1a;現代操作系統的技術原型 誕生&#xff1a;1969年貝爾實驗室&#xff0c;用C語言重寫后實現跨平臺&#xff08;1973年&#xff09;。核心設計&#xff1a; 一切皆文件&#xff08;設備/進程均抽象為文件&#xff09;。管道&#xff08;|&#xff09;和文本…

python計算長方形的周長 2025年3月青少年電子學會等級考試 中小學生python編程等級考試一級真題答案解析

python計算長方形的周長 2025年3月 python編程等級考試一級編程題 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】 1、Python比賽 信息素養大賽Python編程挑戰賽 藍橋杯python選拔賽真題詳解 藍橋杯python省賽真題詳解 藍橋杯python國賽真題詳解 2、Python考級 p…

使用 RedisVL 進行復雜查詢

一、前置條件 在開始之前&#xff0c;請確保&#xff1a; 已安裝 redisvl 并激活相應的 Python 環境。運行 Redis 實例&#xff0c;且 RediSearch 版本 > 2.4。 二、初始化與數據加載 我們將使用一個包含用戶信息的數據集&#xff0c;字段包括 user、age、job、credit_s…

「Linux文件及目錄管理」vi、vim編輯器

知識點解析 vi/vim編輯器簡介 vi:Linux默認的文本編輯器,基于命令行操作,功能強大。vim:vi的增強版,支持語法高亮、多窗口編輯、插件擴展等功能。vi/vim基本模式 命令模式:默認模式,用于移動光標、復制、粘貼、刪除等操作。插入模式:按i進入,用于輸入文本。末行模式:…

電容器保護測控裝置如何選型?

在電力系統的無功補償環節&#xff0c;?電容器保護測控裝置是保障并聯電容器組安全穩定運行的核心設備。其選型需綜合考量保護需求、系統環境及擴展功能。以下是關鍵選型要素分析&#xff1a; ?一、明確核心功能需求? 電容器保護測控裝置&#xff0c;選型時需匹配電容器組實…

最近小峰一直在忙國際化項目,確實有點分身乏術... [特殊字符] 不過! 我正緊鑼密鼓準備一系列干貨文章/深度解析

本人詳解 大家晚上好呀&#xff01;&#x1f319; 最近小峰一直在忙國際化項目&#xff0c;確實有點分身乏術... &#x1f605; 不過&#xff01; 我正緊鑼密鼓準備一系列干貨文章/深度解析&#xff08;選一個更符合你內容的詞&#xff09;&#xff0c;很快就會和大家見面啦&am…

OpenCV CUDA模塊設備層-----設備端(GPU)線程塊級別的一個內存拷貝工具函數blockCopy()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在同一個線程塊&#xff08;thread block內&#xff0c;將 [beg, end) 范圍內的數據并行地復制到 out 開始的位置。 它使用了 CUDA 線程協作機制…

https沒有證書可以訪問嗎?外網怎么訪問內網?

沒有SSL證書的網站無法正常通過HTTPS協議訪問?。HTTPS的實現必須依賴有效的SSL證書完成加密握手&#xff0c;否則瀏覽器會直接阻斷連接或顯示嚴重的安全警告。?? 一、技術實現層面? ?HTTPS協議強制要求證書?。 HTTPS基于SSL/TLS協議實現加密通信&#xff0c;而SSL證書是…

Python pytesseract【OCR引擎庫】 簡介

想全面了解DeepSeek的看過來 【包郵】DeepSeek全攻略 人人需要的AI通識課 零基礎掌握DeepSeek的實用操作手冊指南【限量作者親筆簽名版售完即止】 玩轉DeepSeek這本就夠了 【自營包郵】DeepSeek實戰指南 deepseek從入門到精通實用操作指南現代科技科普讀物AI普及知識讀物人工智…

ubuntu安裝postman教程并中文漢化詳細教程

一、下載postman安裝包 通過網盤分享的文件:Postman-linux-x64-8.7.0.tar.gz 鏈接: https://pan.baidu.com/s/10WYeguDJlK85cKJ6ptX01w?pwd=xqkh 提取碼: xqkh 二、解壓到/opt目錄 tar -zxvf Postman-linux-x64-8.7.0.tar.gz如果子用戶沒有/opt權限,可以給子用戶賦予/opt的…

《壘球知識科普》壘球世界紀錄·壘球1號位

奧運壘球冠軍記錄 歷屆冠軍榜 1996亞特蘭大奧運會 冠軍&#xff1a;美國隊 ? 首屆奧運壘球賽&#xff0c;美國主場3戰全勝奪冠&#xff01; 1996 Atlanta Olympics Champion: USA ? Dominated all 3 games in first Olympic softball event 2000悉尼奧運會 冠軍&#…