JMeter與大模型融合應用之構建AI智能體:評審性能測試腳本
一、引言
隨著DevOps和持續測試的普及,性能測試已成為軟件開發生命周期中不可或缺的環節。Apache JMeter作為最流行的開源性能測試工具之一,被廣泛應用于各種性能測試場景。然而,編寫高質量的JMeter測試腳本需要豐富的經驗和專業知識。本文將探討如何利用AI技術構建智能體,自動評審JMeter性能測試腳本,提高測試腳本的質量和可靠性。
二、JMeter腳本評審的挑戰
2.1 人工評審的局限性
傳統上,JMeter腳本評審主要依賴人工完成,這種方式存在以下問題:
● 評審效率低下,難以適應敏捷開發節奏
● 評審結果受評審者經驗影響較大
● 難以保證評審標準的一致性
● 容易遺漏潛在的性能測試陷阱
2.2 常見腳本問題類型
● 配置錯誤:線程組設置不當、超時配置不合理等
● 邏輯缺陷:控制器使用錯誤、變量作用域問題等
● 性能反模式:缺少思考時間、未使用連接池等
● 可維護性問題:硬編碼值、缺乏模塊化等
三、AI智能體架構設計
3.1 系統架構
3.2 核心組件
- 腳本解析:將JMX文件進行解析,解釋完成以后跟提供的prompt進行結合生成最終待評審結果內容。
- 格式校驗:針對JMX文件考慮到各種特殊字符的存在,在生成JSON格式的時候會存在各種問題,所以需要對格式進行統一校驗,符合JSON格式。
- DeepSeek:作為MOE的其中之一角色:性能測試專家,針對編寫的性能測試腳本進行評審,給出亮點和缺點。
- 結果反饋:針對評審的結果進行反饋供用戶進行修改。
四、關鍵技術實現
4.1 格式校驗
package org.apache.jmeter.sptp.util;import org.json.JSONObject;public class JsonEscapeUtil {public static String escapeForJson(String input) {if (input == null) {return null;}try {return JSONObject.quote(input);} catch (Exception e) {return customEscape(input);}}private static String customEscape(String input) {StringBuilder sb = new StringBuilder();for (int i = 0; i < input.length(); i++) {char c = input.charAt(i);switch (c) {case '"':sb.append("\\\"");break;case '\\':sb.append("\\\\");break;case '/':sb.append("\\/");break;case '\b':sb.append("\\b");break;case '\f':sb.append("\\f");break;case '\n':sb.append("\\n");break;case '\r':sb.append("\\r");break;case '\t':sb.append("\\t");break;default:if (c <= '\u001F') {sb.append(String.format("\\u%04x", (int) c));} else {sb.append(c);}}}return sb.toString();}
}
4.2 DeepSeek模型調用
package org.apache.jmeter.sptp.business;import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.jmeter.sptp.util.JsonEscapeUtil;import static org.apache.jmeter.sptp.SPTPInfo.baseUrl;
import static org.apache.jmeter.sptp.SPTPInfo.model;
import static org.apache.jmeter.sptp.util.JsonEscapeUtil.escapeForJson;public class Qwen {private final Logger log = LoggerFactory.getLogger(this.getClass());public String QwenAI(String prompt){String content = "你是一位性能測試專家,擅長編寫利用JMeter進行性能測試腳本編寫以及評審其他人編寫的性能測試腳本,請針對給出的性能測試腳本進行評審,并且按照亮點和缺點進行羅列,并且計算亮點和缺點的個數,針對缺點,請給出詳細的改進措施供測試人員進行修改,羅列的要求如【】所示,樣例如下:亮點:1.利用BeanShell進行變成 2.使用邏輯控制器對事務進行邏輯控制 缺點:1.輸入的參數沒有進行參數化,例如id為adcd,改進建議:id使用csv文件參數化 2.部分路徑寫的是絕對路徑,沒有變成相對路徑,例如C:/2/text.txt,改進建議:使用相對路徑 總體亮點:2個,缺點2個 輸出總體亮點和缺點以后輸出結束,不需要再輸出任何內容,不需要單獨輸出額外的改進措施,改進措施已經在缺點后面的改進建議中描述,具體腳本內容如下";String result = "";String testString = content + prompt;
// log.info(content + prompt);String escapedJson = escapeForJson(testString);
// log.info(escapedJson);String requestBody = "{\n" +" \"model\": \" " + model + "\",\n" +" \"messages\": [\n" +" {\n" +" \"role\": \"user\",\n" +" \"content\": " + escapedJson + " \n" +" }\n" +" ]\n" +"}";
// log.info(requestBody);HttpResponse execute = HttpRequest.post(baseUrl).header("Accept", "application/json").body(requestBody).execute();String body = execute.body();JSONObject jsonObject = JSONObject.parseObject(body);String choices = jsonObject.getString("choices");JSONArray choicesArray = JSONObject.parseArray(choices);String o = choicesArray.getString(0);JSONObject json = JSONObject.parseObject(o);String message = json.getString("message");JSONObject jsonMessage = JSONObject.parseObject(message);result = jsonMessage.getString("content");return result;}}
4.3 結果反饋展示
package org.apache.jmeter.sptp.gui;import org.apache.jmeter.sptp.business.Qwen;
import org.apache.jmeter.sptp.util.GetJMXInfo;
import org.apache.jmeter.util.JMeterUtils;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;import static org.apache.jmeter.JMeter.fileJMXPath;public class ChatWindow extends JFrame {private JTextArea chatArea;private JButton sendButton;private JButton clearButton;public ChatWindow() {super("AI腳本評審智能體");setIconImage(JMeterUtils.getImage("AI.png").getImage());setLayout(new BorderLayout());setSize(500, 400);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);// 創建聊天區域chatArea = new JTextArea();chatArea.setEditable(false);chatArea.setLineWrap(true); // 設置自動換行chatArea.setWrapStyleWord(true); // 設置單詞級別的換行JScrollPane scrollPane = new JScrollPane(chatArea);add(scrollPane, BorderLayout.CENTER);// 創建發送按鈕sendButton = new JButton("發送內容");sendButton.addActionListener(new SendActionListener());// 創建清空按鈕clearButton = new JButton("清空內容");clearButton.addActionListener(new ClearActionListener());// 創建按鈕面板JPanel buttonPanel = new JPanel();buttonPanel.add(sendButton);buttonPanel.add(clearButton);// 創建輸入面板JPanel inputPanel = new JPanel();inputPanel.add(buttonPanel);add(inputPanel, BorderLayout.SOUTH);// 設置窗口居中顯示setLocationRelativeTo(null);setVisible(true);}private class SendActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {String filePath = fileJMXPath;String jmxContent = GetJMXInfo.readContent(filePath);new SwingWorker<String, Void>() {@Overrideprotected String doInBackground() throws Exception {setTitle("AI腳本評審智能體正在思考中...");setIconImage(JMeterUtils.getImage("thinking.png").getImage());Qwen qwen = new Qwen();return qwen.QwenAI(jmxContent);}@Overrideprotected void done() {try {String result = get();chatArea.append("大模型:" + result + "\n");setTitle("AI腳本評審智能體");setIconImage(JMeterUtils.getImage("AI.png").getImage());} catch (Exception ex) {ex.printStackTrace();}}}.execute();setTitle("AI腳本評審智能體");setIconImage(JMeterUtils.getImage("AI.png").getImage());}}private class ClearActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {chatArea.setText("");}}
}
五、效果展示
效果展示如下:
五、結論
通過構建AI智能體來自動評審JMeter性能測試腳本,可以顯著提高腳本質量,降低人為錯誤,并確保性能測試的可靠性。這種結合規則引擎和機器學習的方法,不僅適用于JMeter,也可推廣到其他測試工具和場景。隨著AI技術的不斷發展,智能評審將成為性能測試工程中的標準實踐,為軟件質量保障提供強有力的支持。