背景
Jmeter有很多的配置元件可以定义变量值在测试过程中使用
比如最常见的两个:
配置元件主要是用于测试前配置,将配置转换为变量设置到Jmeter context中。
而Jmeter默认并没有配置文件(.properties)读取器,但由于Jmeter是开源的,我们自己可以自定义一个配置元件来读取配置文件。
目标
启动Jmeter后,我们可以从配置元件中看到“Property File Reader”,即我们自定义扩展的配置文件。
在测试计划中添加它后,输入配置文件路径:
比如以下是我们的配置文件
创建一个简单的测试,如下图Debug Sampler的响应数据显示了我们读到属性值jmeter插件,在Jmeter中通过表达式${__P(Propertyname)}来获取属性值
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项目jmeter插件,并导入相关依赖包
<?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">
4.0.0
com.techstar.plugins.configelement
PropertyReader
1.0-SNAPSHOT
org.apache.maven.plugins
maven-compiler-plugin
7
7
${basedir}/src/main/resources
**/*
true
${basedir}/src/main/java
**/*
org.apache.jmeter
ApacheJMeter_core
4.0
org.slf4j
slf4j-log4j12
1.7.25
org.apache.logging.log4j
log4j-api
2.11.1
org.apache.logging.log4j
log4j-core
2.11.1
扩展配置元件创建读取配置文件类
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类
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配置文件
#配置元件
displayName=Property File Reader
#元素的显示名称
propFilePath.displayName=File Path
#元素的简短描述
propFilePath.shortDescription=Absolute Path of the Property file
插件目录结构
插件打包
测试插件
插件测试成功~
本文源码:
性能工具之Jmeter系列:
参考文献:
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688