首页 > 其他分享 >性能工具之Jmeter扩展配置元件插件

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

时间:2023-04-06 16:03:01浏览次数:56  
标签:插件 配置文件 GUI public org Jmeter 元件

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

背景

Jmeter有很多的配置元件可以定义变量值在测试过程中使用

比如最常见的两个:

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

配置元件主要是用于测试前配置,将配置转换为变量设置到Jmeter context中。

而Jmeter默认并没有配置文件(.properties)读取器,但由于Jmeter是开源的,我们自己可以自定义一个配置元件来读取配置文件。

目标

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

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

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

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

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


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

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

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

性能工具之Jmeter扩展配置元件插件_字段_05

Jmeter的插件加载机制

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

1. ClassFinder.findClassesThatExtend(
2.     JMeterUtils.getSearchPaths(), 
3.     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>
    </dependencies>
</project>

扩展配置元件

创建读取配置文件类

  • 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;
    }
}

创建插件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,"");

    }
}

创建插件GUI配置文件

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

#元素的显示名称
propFilePath.displayName=File Path
#元素的简短描述
propFilePath.shortDescription=Absolute Path of the Property file

插件目录结构

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


插件打包

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

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

测试插件

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

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

插件测试成功~


本文源码:

https://github.com/zuozewei/Jmeter-Porperty-File-Reader-Plugin


性能工具之Jmeter系列:

性能工具之Jmeter压测Hprose RPC服务

性能工具之Jmeter扩展函数及压测ActiveMQ实践

性能工具之Jmeter压测Thrift RPC服务


参考文献:

http://www.testautomationguru.com/extending-jmeter-creating-custom-config-element-property-file-reader/

标签:插件,配置文件,GUI,public,org,Jmeter,元件
From: https://blog.51cto.com/u_15181572/6173494

相关文章

  • 小程序对接三方插件契约锁
    1.申请插件在开始开发前,需要先申请契约锁小程序插件的使用权限,开发者需要登录自身小程序管理后台,在”设置-第三方服务-插件管理“中添加小程序插件,通过如下appId:wxaf8f505686ddf66a匹配到插件后添加即可提交申请。 2.引入插件,也可在分包目录下引入,在主包内引入可能会超两......
  • 性能工具之Jmeter小白入门系列之五
    专气致柔,能如婴儿乎---《道德经》第十章一、Jmeter命令行启动   Jmeter有两种运行:一种是采用的界面模式(GUI)启动,会占用不少系统资源;另一种是命令行模式(non-GUI)执行,这样节约资源,在性能测试,基本都是按这种方式运行。启动命令:jmxfileresultsfile :结果保存文件类型......
  • 性能工具之Jmeter小白入门系列之四
        青,取之于蓝,而青于蓝;冰,水为之,而寒于水。木直中绳,輮以为轮,其曲中规。虽有槁暴,不复挺者,輮使之然也。故木受绳则直,金就砺则利,君子博学而日参省乎己,则知明而行无过矣。  一、Jmeter中参数取值1、TestPlan中添加变量TestPlan中设置好变量名,变量名可以在任意的位置引用,比......
  • 性能工具之Jmeter小白入门系列之二
         在上一讲中简单的介绍了Jmeter的安装与HttpRequet请求,在实际工作,咱们对工具的使用还需咱们进一步学习与操作才能掌握;  话说【间单的事情重复做,就会成为行家;简单的事情用心做,就会成为赢家。简单的法坚持修,就会成为大法,每天持之以恒做简单的事情,这个人就会不简单】......
  • jmeter模拟多IP地址访问
    1.前言:今天一同事在压测时提到怎么用jmeter里虚拟多个ip来发送请求,我想了一下以前用LR时用过虚拟ip地址,jmeter还没有使用过。想着原理应该是相通的,既然LR都能支持的话,那Jmeter应该也是支持,于是就有了jmeter虚拟化IP地址的研究。在网上也查找了相应的资料,摸索参考着实践了一把,坑吃......
  • jmeter模拟多IP地址访问
    1.前言:今天一同事在压测时提到怎么用jmeter里虚拟多个ip来发送请求,我想了一下以前用LR时用过虚拟ip地址,jmeter还没有使用过。想着原理应该是相通的,既然LR都能支持的话,那Jmeter应该也是支持,于是就有了jmeter虚拟化IP地址的研究。在网上也查找了相应的资料,摸索参考着实践了一把,坑吃......
  • Kubernetes 如何安装 NFS-Subdir-External-Provisioner存储插件?
    一、搭建NFS服务器1、背景介绍Kubernetes对Pod进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将Pod分配到该节点上。在这种情况下,Pod中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当Pod出现故障,Kubernetes......
  • vscode配置docker插件
    参考:https://zhuanlan.zhihu.com/p/530413695  ================================================  本文不对vscode、docker的安装及docker插件的安装进行讲解,本文只讲在vscode上如何配置以使docker插件正常使用。 VSCODE上安装好docker插件后会发现并不能正常使用......
  • VSCode更改插件安装位置
    1、使用–extensions-dir命令使用命令行打开VSCode,增加参数–extensions-dir插件路径这种方式存在弊端,就是命令行窗口不能关闭。当然也可以增加一个.bat文件打开编辑器。2、使用–extensions-dir命令如果不在安装目录里面创建data目录,那么vscode默认是在C:\Users\dell.vscode......
  • Blender网格建模插件MESHmachine倒角和圆角:扁平 化
    推荐:将NSDT场景编辑器加入你的3D工具链编辑模式ye使用拼合工具,您可以拼合单个或多个多边形,并且可以在2种模式下展平:沿边或沿法线。选择展平可以采取2种选择。您可以选择 3个折点或多个多边形,其中一个处于活动状态。如果选择3个顶点,则连接多边形的所有顶点都将根据3个顶点......