性能工具之Jmeter扩展配置元件插件

简介: 【5月更文挑战第20天】性能工具之Jmeter扩展配置元件插件

一、背景

Jmeter有很多的配置元件可以定义变量值在测试过程中使用
比如最常见的两个:

  • 用户自定义变量
  • CSV数据文件设置

配置元件主要是用于测试前配置,将配置转换为变量设置到Jmeter context中。
而Jmeter默认并没有配置文件(.properties)读取器,但由于Jmeter是开源的,我们自己可以自定义一个配置元件来读取配置文件。

二、目标

启动Jmeter后,我们可以从配置元件中看到Property File Reader,即我们自定义扩展的配置文件。
image.png

在测试计划中添加它后,输入配置文件路径:

  • 支持绝对或相对路径
  • 相对路径相对与当前测试计划JMX文件

image.png

比如以下是我们的配置文件

image.png

创建一个简单的测试,如下图Debug Sampler的响应数据显示了我们读到属性值,在Jmeter中通过表达式${__P(Propertyname)}来获取属性值

image.png

三、Jmeter的插件加载机制

Jmeter启动扫描扩展下的所有实现了JmterGUIComponent和TestBean接口的类,然后进行初始化。

ClassFinder.findClassesThatExtend(
    JMeterUtils.getSearchPaths(), 
    new Class[] {
   
   JMeterGUIComponent.class, TestBean.class }

所以只要确保插件的jar包在扩展路径下,默认路径是: JMETER_HOME/lib/ext

四、Jmeter的GUI机制

由于Jmeter是一个基于Swing的GUI工具,所以对它的GUI框架也需要有一定了解。JMeter内部有两种GUI框架

1.直接继承 JMeterGUIComponent接口的抽象实现类:

  org.apache.jmeter.config.gui.AbstractConfigGui
  org.apache.jmeter.assertions.gui.AbstractAssertionGui
  org.apache.jmeter.control.gui.AbstractControllerGui
  org.apache.jmeter.timers.gui.AbstractTimerGui
  org.apache.jmeter.visualizers.gui.AbstractVisualizer
  org.apache.jmeter.samplers.gui.AbstractSamplerGui

2.通过Swing的Bean绑定机制

前者的好处是自由度高,可定制性强,但需要开发者关心GUI控件布局,以及从控件到Model的转换。 后者基本不需要开发者接触到GUI层的东西,定义好Bean以及BeanInfo即可。但SampleListener不支持BeanInfo方式定义。

五、IDE设置

首先我们需要新建一个 Maven项目,并导入相关依赖包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.techstar.plugins.configelement</groupId>
    <artifactId>PropertyReader</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>7</source>
                    <target>7</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <!-- 编译之后包含xml和properties -->
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <!--解决构建项目时,target/classes目录下不存在资源文件-->
            <resource>
                    <directory>${basedir}/src/main/java</directory>
                    <includes>
                        <include>**/*</include>
                    </includes>
            </resource>
        </resources>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>2.9.3</version>
        </dependency>
    </dependencies>
</project>

六、扩展配置元件

1、创建读取配置文件类

  • TestBean是一个标记接口,它会告诉Jmeter创建Test Bean GUI
  • 我们还需要实现TestStateListener接口来读取配置文件

    public class PropertyReader extends ConfigTestElement implements TestBean, TestStateListener {
         
         
    
      //定义根日志器
      private static final Logger logger = LogManager.getLogger(PropertyReader.class);
      //配置文件路径
      private String propFilePath;
    
      public PropertyReader(){
         
         
          super();
      }
    
      /**
       * 在主线程测试开始之前被调用
       * 我们需要在测试前加载配置
       */
      public void testStarted() {
         
         
          //判断字段是否为空
          if (StringUtils.isNotEmpty(getPropFilePath())){
         
         
              try {
         
         
                  //使用传入的字符串返回一个Path对象
                  Path path = Paths.get(getPropFilePath());
                  //判断是否为为绝对路径
                  if (!path.isAbsolute()) {
         
         
                      //得到文件路径
                      path = Paths.get(FileServer.getFileServer().getBaseDir(), path.toString());
                  }
                  //加载配置文件
                  JMeterUtils.getJMeterProperties().load(new FileInputStream(path.toString()));
                  logger.info("loading Property:"+path);
                  } catch (FileNotFoundException e) {
         
         
                      logger.error(e.getMessage());
                  } catch (IOException e){
         
         
                      logger.error(e.getMessage());
              }
              }
          }
    
      /**
       * 在主线程测试开始之前被调用
       * @param s
       */
      public void testStarted(String s) {
         
         
          testStarted();
      }
    
      /**
       * 测试结束后,所有线程都调用一次
       */
      public void testEnded() {
         
          }
    
      /**
       * 测试结束后,所有线程都调用一次
       * @param s
       */
      public void testEnded(String s) {
         
          }
    
      /**
       * 返回配置文件路径
       * @return
       */
      public String getPropFilePath(){
         
         
          return this.propFilePath;
      }
    
      /**
       * 读取配置文件路径
       * @param propFilePath
       */
      public void setPropFilePath(String propFilePath){
         
         
          this.propFilePath = propFilePath;
      }
    }
    

    2、创建插件GUI类

  • 我们还需要为我们的插件创建GUI类
  • GUI类的名字必须是[ComponentName]Beaninfo,且在同一个包中
  • File Path:GUI中的一个显示字段
  • 默认情况:字段是空的,如果没有设置的话

    public class PropertyReaderBeanInfo extends BeanInfoSupport {
      //创建一个文件路径常量
      private  static final String FIELD_PROPERTY_FILE_PATH = "propFilePath";
    
      /**
       * 创建一个无参构造函数
       */
      public PropertyReaderBeanInfo() {
          //调用配置文件读取类
          super(PropertyReader.class);
          //在Jmeter GUI中添加字段及设置
          //添加"FIELD_PROPERTY_FILE_PATH"字段
          PropertyDescriptor p = property(FIELD_PROPERTY_FILE_PATH);
          //设置该字段必填项
          p.setValue(NOT_UNDEFINED,Boolean.FALSE);
          //设置该字段默认值
          p.setValue(DEFAULT,"");
    
      }
    }
    

3、创建插件GUI配置文件

  • 在同一个包中有GUI配置文件,它包含显示名、简短描述等
  • 该文件的命名必须是[ComponentName]Resources.properties
    ```

    配置元件

    displayName=Property File Reader

元素的显示名称

propFilePath.displayName=File Path

元素的简短描述

propFilePath.shortDescription=Absolute Path of the Property file
```

4、插件目录结构

image.png

5、插件打包

  • 使用mvn clean package命令打包
  • 插件的jar包放到JMETER_HOME/lib/ext
  • 重启Jmeter
  • 从配置元件中打开-Proerty File Reader

七、测试插件

增加一个BeanShell Sampler去打印配置文件的值
运行测试,检查Jmeter log

image.png

插件测试成功~

本文源码:

目录
相关文章
|
18天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
45 2
|
13天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
1月前
|
存储 Linux 数据库
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
【8月更文挑战第7天】性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
56 1
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
|
1月前
|
监控 Java 测试技术
实战派必看!Python性能测试中,JMeter与Locust如何助力性能调优
【8月更文挑战第6天】性能优化是软件开发的关键。本文介绍JMeter与Locust两款流行性能测试工具,演示如何用于Python应用的性能调优。JMeter可模拟大量用户并发访问,支持多种协议;Locust用Python编写,易于定制用户行为并模拟高并发。根据场景选择合适工具,确保应用在高负载下的稳定运行。
89 4
|
1月前
|
测试技术 持续交付 Apache
深度挖掘:Python性能测试中JMeter与Locust的隐藏技能🔍
【8月更文挑战第5天】随着软件规模扩大,性能测试对系统稳定性至关重要。Apache JMeter和Locust是两大主流工具,各有千秋。本文探索它们在Python环境下的进阶用法,挖掘更多性能测试潜力。JMeter功能强大,支持多种协议,可通过命令行模式执行复杂测试计划,并与Python集成实现动态测试数据生成。Locust基于Python,通过编写简洁脚本模拟HTTP请求,支持自定义请求及与Python库深度集成。掌握这些技巧可实现高度定制化测试场景,有效识别性能瓶颈,提升应用稳定性。
113 1
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【8月更文挑战第5天】性能测试确保应用高负载下稳定运行。Apache JMeter与Locust是两大利器,助力识别解决性能瓶颈。本文介绍这两款工具的应用与优化技巧,并通过实战示例展示性能测试流程。首先,通过JMeter测试静态与动态资源;接着,利用Locust的Python脚本模拟HTTP请求。文中提供安装指南、命令行运行示例与性能优化建议,帮助读者掌握性能测试核心技能。
81 0
|
1月前
|
消息中间件 Java 测试技术
Python性能测试全攻略:JMeter与Locust,双剑合璧斩断性能瓶颈🗡️
【8月更文挑战第4天】在软件开发中,性能至关重要。对Python开发者来说,掌握高效性能测试方法尤为关键。本文将带您探索性能测试工具JMeter与Locust的强大功能。JMeter作为Java世界的巨擘,以其强大功能和灵活性在性能测试领域占有一席之地,不仅适用于Java应用,也能测试Python Web服务。
84 0
|
15天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
74 7
Jmeter实现WebSocket协议的接口测试方法
|
17天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
46 2
|
22天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
44 5