当前位置: 首页 > news >正文

JMeter与大模型融合应用之构建AI智能体:评审性能测试脚本

JMeter与大模型融合应用之构建AI智能体:评审性能测试脚本

一、引言

随着DevOps和持续测试的普及,性能测试已成为软件开发生命周期中不可或缺的环节。Apache JMeter作为最流行的开源性能测试工具之一,被广泛应用于各种性能测试场景。然而,编写高质量的JMeter测试脚本需要丰富的经验和专业知识。本文将探讨如何利用AI技术构建智能体,自动评审JMeter性能测试脚本,提高测试脚本的质量和可靠性。

二、JMeter脚本评审的挑战

2.1 人工评审的局限性

传统上,JMeter脚本评审主要依赖人工完成,这种方式存在以下问题:
● 评审效率低下,难以适应敏捷开发节奏
● 评审结果受评审者经验影响较大
● 难以保证评审标准的一致性
● 容易遗漏潜在的性能测试陷阱

2.2 常见脚本问题类型

● 配置错误:线程组设置不当、超时配置不合理等
● 逻辑缺陷:控制器使用错误、变量作用域问题等
● 性能反模式:缺少思考时间、未使用连接池等
● 可维护性问题:硬编码值、缺乏模块化等

三、AI智能体架构设计

3.1 系统架构

在这里插入图片描述

3.2 核心组件

  1. 脚本解析:将JMX文件进行解析,解释完成以后跟提供的prompt进行结合生成最终待评审结果内容。
  2. 格式校验:针对JMX文件考虑到各种特殊字符的存在,在生成JSON格式的时候会存在各种问题,所以需要对格式进行统一校验,符合JSON格式。
  3. DeepSeek:作为MOE的其中之一角色:性能测试专家,针对编写的性能测试脚本进行评审,给出亮点和缺点。
  4. 结果反馈:针对评审的结果进行反馈供用户进行修改。

四、关键技术实现

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技术的不断发展,智能评审将成为性能测试工程中的标准实践,为软件质量保障提供强有力的支持。

http://www.xdnf.cn/news/1324153.html

相关文章:

  • 【Jenkins】03 - 自动构建和docker构建
  • MCP协议演进:从SSE到Streamable HTTP的技术革命
  • 宁波市第八届网络安全大赛初赛(REVERSE-Writeup)
  • FPGA-Vivado2017.4-建立AXI4用于单片机与FPGA之间数据互通
  • OpenTelemetry、Jaeger 与 Zipkin:分布式链路追踪方案对比与实践
  • vscode wsl解决需要用别的用户调试的问题
  • VSCode REST Client 使用总结
  • Linux下的软件编程——IPC机制
  • Linx--MySQL--安装笔记详细步骤!
  • k8sday10服务发现(1/2)
  • 数据泵实施VPS海外:跨国数据同步的完整解决方案
  • 45 C++ STL模板库14-容器6-容器适配器-优先队列(priority_queue)
  • 系统架构评估方法全景解析
  • 【Java基础常见辨析】重载与重写,深拷贝与浅拷贝,抽象类与普通类
  • LLM - MCP传输协议解读:从SSE的单向奔赴到Streamable HTTP的双向融合
  • mq存量消息如何处理
  • 【iOS】Block补充
  • RecSys:排序中的融分公式与视频播放建模
  • 数据结构(03)——线性表(顺序存储和链式存储)
  • 从哲学(业务)视角看待数据挖掘:从认知到实践的螺旋上升
  • 常见的光源频闪控制方式
  • CSDN转PDF【无水印且免费!!!】
  • 数字时代著作权侵权:一场资本与法律的博弈
  • Gartner发布2025年AI与网络安全成熟度曲线:用AI增强网络安全计划的27项技术与创新
  • C++ const
  • Swift 实战:判断点集是否关于某条直线对称(LeetCode 356)
  • Effective C++ 条款48:认识模板元编程
  • 【前端面试题】JavaScript 核心知识点解析(第一题到第十三题)
  • 【Python语法基础学习笔记】条件表达式和逻辑表达式
  • 03.文件管理和操作命令