Jmeter二次开发流程拆解与环境初始化工具类封装

Jmeter二次开发流程拆解与环境初始化工具类封装

前言

从之前几集里,我们完成了测试用例接口与测试模块接口的开发以及Jmeter二次开发的Demo。

这一集我们将会正式对Jmeter进行二次开发。

Jmeter二次开发流程拆解

那么在开发之前,我们要去对Jmeter二次开发进行步骤的拆解与分析。

那么还是先来继续看一下之前的Demo代码。

java 复制代码
 
public class TestStress {
    @Test
    public void testJmeterScript()throws Exception{
        // JMeter路径
        String jmeterPath = "G:\\Jmeter\\apache-jmeter-5.6.3";
        // JMeter根目录
        File jmeterHome = new File(jmeterPath);
        // JMX文件路径
        String jmxFilePath = "E:\\XXX\\JMX\\pay_json.jmx";
        // JMX文件
        File jmxFile = new File(jmxFilePath);
        // JMeter配置文件路径
        File jmeterProperties = new File(jmeterHome.getPath() + File.separator + "bin" + File.separator + "jmeter.properties");
        // 设置JMeter根目录
        JMeterUtils.setJMeterHome(jmeterHome.getPath());
        // 加载JMeter配置文件
        JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());
 
        // JMeter标准引擎
        StandardJMeterEngine jmeter = new StandardJMeterEngine();
        // 测试计划树
        HashTree testPlanTree = new HashTree();
 
        // 设置文件服务器的基础脚本路径
        FileServer.getFileServer().setBaseForScript(jmxFile);
        // 加载测试计划树 jmx脚本
        testPlanTree = SaveService.loadTree(jmxFile);
 
        // 转换测试计划树
        JMeter.convertSubTree(testPlanTree, false);
 
        // Summariser对象
        Summariser summer = null;
        // Summariser名称
        String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
        if (!summariserName.isEmpty()) {
            // 创建Summariser对象
            summer = new Summariser(summariserName);
        }
        // 结果日志文件名
        String logFile = "example.csv";
        // 结果收集器
        ResultCollector logger = new ResultCollector (summer);
        logger.setFilename(logFile);
        // 将结果收集器添加到测试计划树上
        testPlanTree.add(testPlanTree.getArray()[0], logger);
        // 配置JMeter引擎
        jmeter.configure(testPlanTree);
        // 运行JMeter测试
        jmeter.run();
    }
}

其实在Jmeter二次开发Demo那一集我们也梳理过,我们的四大步骤如下:

  1. 环境初始化
  2. 配置脚本
  3. 结果集配置
  4. 执行测试用例

其中,环境初始化,表示设置Jmeter运行环境。配置脚本,即通过各种方式加载Jmeter脚本文件。

结果集配置,即配置结果集,收集测试过程产生的数据。执行测试用例,即启动线程组,采样器的执行,监听器和后处理。

JmeterEngine模块封装

需求

JmeterEngine支持两种测试计划录入

  • 本地上传JMX脚本
  • 在线创建测试计划

JmeterEngine支持两种执行压测,对外提供HTTP接口。

  • 本地JMX执行
  • 在线创建测试计划执行

封装环境初始化工具类

看完需求,我们要从Jmeter二次开发的流程中去开发我们的工具类,这样更利于后续代码的开发,请看下图。

从这图中,我们也能大致想出有哪些工具类是需要进行开发的。

我们大致需要完成以下几个接口:

  • 获取Jmeter home路径
  • 获取Jmeter bin目录
  • 初始化Jmeter配置
  • 获取JmeterEngine
getJmeterHome
java 复制代码
public static String getJmeterHome(){
        try{
            return StressTestUtil.class.getClassLoader().getResource("jmeter").getPath();
        }catch (Exception e){
            throw new RuntimeException("获取jmeter路径失败");
        }
    }

获取Jmeter的home目录,这里的Jmeter的home目录是临时的,我把它放在了resources底下。

getJmeterHomeBin
java 复制代码
public static String getJmeterHomeBin(){
        return getJmeterHome() + File.separator + "bin";
    }

这个会更简单,因为Bin目录在Home目录的底下。

initJmeterProperties
java 复制代码
public static void initJmeterProperties(){
        String jmeterHome = getJmeterHome();
        String jmeterHomeBin = getJmeterHomeBin();
        //加载jmeter的配置文件
        JMeterUtils.loadProperties(jmeterHomeBin + File.separator + "jmeter.properties");

        //设置jmeter的安装目录
        JMeterUtils.setJMeterHome(jmeterHome);
        //避免中文响应乱码
        JMeterUtils.setProperty("sampleresult.default.encoding","UTF-8");
        //初始化本地环境
        JMeterUtils.initLocale();
    }

这里初始化Jmeter的配置。

getJmeterEngine
java 复制代码
public static StandardJMeterEngine getJmeterEngine(){
        //先初始化配置
        initJmeterProperties();
        return new StandardJMeterEngine();
    }

这个就是获取一个JmeterEngine,记得要先初始化哦~

完整代码
java 复制代码
public class StressTestUtil {


    /**
     * 获取jmeterhome路径,临时路径
     * @return
     */
    public static String getJmeterHome(){
        try{
            return StressTestUtil.class.getClassLoader().getResource("jmeter").getPath();
        }catch (Exception e){
            throw new RuntimeException("获取jmeter路径失败");
        }
    }

    /**
     * 获取jmeter bin目录
     * @return
     */
    public static String getJmeterHomeBin(){
        return getJmeterHome() + File.separator + "bin";
    }

    /**
     * 初始化jmeter配置
     */
    public static void initJmeterProperties(){
        String jmeterHome = getJmeterHome();
        String jmeterHomeBin = getJmeterHomeBin();
        //加载jmeter的配置文件
        JMeterUtils.loadProperties(jmeterHomeBin + File.separator + "jmeter.properties");

        //设置jmeter的安装目录
        JMeterUtils.setJMeterHome(jmeterHome);
        //避免中文响应乱码
        JMeterUtils.setProperty("sampleresult.default.encoding","UTF-8");
        //初始化本地环境
        JMeterUtils.initLocale();
    }

    public static StandardJMeterEngine getJmeterEngine(){
        //先初始化配置
        initJmeterProperties();
        return new StandardJMeterEngine();
    }

}
相关推荐
小马爱打代码15 分钟前
Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
spring boot·后端·微服务
有想法的py工程师23 分钟前
PostgreSQL 查询库中所有表占用磁盘大小、表大小
数据库·postgresql
旷世奇才李先生36 分钟前
奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
spring boot·面试·java-rabbitmq
yngsqq42 分钟前
netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
java·前端·c#
曾曜1 小时前
PostgreSQL逻辑复制的原理和实践
后端
A了LONE1 小时前
h5的底部导航栏模板
java·前端·javascript
豌豆花下猫1 小时前
Python 潮流周刊#110:JIT 编译器两年回顾,AI 智能体工具大爆发(摘要)
后端·python·ai
颜挺锐1 小时前
在 JMeter 中,将日期字符串(如 2025-06-07 00:00:00)转换为时间戳(毫秒级),可以使用以下两种方法
jmeter
轻语呢喃1 小时前
JavaScript :事件循环机制的深度解析
javascript·后端
ezl1fe1 小时前
RAG 每日一技(四):让AI读懂你的话,初探RAG的“灵魂”——Embedding
后端