8、JMeter扩展开发
扩展组件开发的意义
- 输入参数
- 协议
- 复杂调用逻辑
- 功能
- 等等
开发前的工具准备
- 下载jdk并安装,配置环境变量
- 下载maven,配置环境变量
- 修改settings.xml本地仓库,远程仓库的地址
- Eclipse新建Maven项目
- 编辑 pom.xml
Maven常用命令
- Maven是一个项目管理工具(打包工具)
- mvn clean 清理项目生产的临时文件,一般是模块下的target目录
- mvn package 项目打包工具,会在模块下的target目录生成jar或war等文件,如下运行结果。
- mvn test 测试命令,或执行src/test/java/下junit的测试用例
- mvn install 模块安装命令 将打包的的jar/war文件复制到你的本地仓库中
扩展开发实现的两种方式
- 编写类文件,在BeanShell中调用
- 继承AbstractJavaSamplerClient抽象类,实现JavaSamplerClient接口,在Java请求中调用
- 继承AbstractFunction类,在函数助手中调用
扩展开发HelloWorld的实现
public class Demo1 extends AbstractJavaSamplerClient{
public SampleResult runTest(JavaSamplerContext arg0) {
System.out.println("hello,jmeter");
return null;
}
}
maven build后把jar包放在D:\apache-jmeter-5.5\lib\ext,重启Jmeter,创建Java请求,查看控制台结果
JavaSamplerClient
JavaSamplerClient实现方法的介绍
- setupTest(JavaSamplerContext context):初始化方法
- runTest(JavaSamplerContext context):实现具体功能逻辑的方法
- getDefaultParameters():决定了JMeter当中要显示哪些属性
- teardownTest(JavaSamplerContext context):负责清理收尾工作
JavaSamplerClient实现方法-自定义参数的实现
public static String URLNAME="URL";
public static String DEFAULTURL="http://www.baidu.com";
public Arguments getDefaultParameters() {
System.out.println("getDefaultParameters");
Arguments arguments =new Arguments();
arguments.addArgument(this.URLNAME, this.DEFAULTURL);
return arguments;
}
JavaSamplerClient实现方法-初始化方法的实现
private String inputUrl;
public void setupTest(JavaSamplerContext context) {
this.inputUrl = context.getParameter(this.URLNAME, this.DEFAULTURL);
System.out.println("你访问的是" + inputUrl);
}
JavaSamplerClient实现方法-响应数据显示到结果树
private String resultData;
public SampleResult runTest(JavaSamplerContext context) {
System.out.println("Hello-runTest");
resultData = "这是响应结果";
SampleResult result = new SampleResult();
result.setSuccessful(true);
result.setSampleLabel("修改了名称");
result.setResponseData(resultData, null);
result.setDataType(SampleResult.TEXT);
return result;
}
自定义Java请求的实现
补充JavaSamplerClient接口的runTest方法
URL url = new URL(inputUrl);
URLConnection urlcon = url.openConnection();
byte[] buffer = new byte[1024];
int len;
result.sampleStart();
InputStream in = urlcon.getInputStream();
while ((len = in.read(buffer)) != -1) {
resultData = new String(buffer, "utf-8");
sBuffer.append(resultData);
}
自定义函数的实现
库引用
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>5.5</version>
</dependency>
要实现扩展JMeter function,主要有两点:
实现function的类的package声明必须包含“.functions”
需要继承org.apache.jmeter.functions.AbstractFunction,并且实现相应的方法
- execute(SampleResult previousResult, Sampler currentSampler):执行方法
- getArgumentDesc():功能描述,参数描述
- setParameters(Collection<CompoundVariable> parameters):接收用户的参数,设置参数
- getReferenceKey():函数功能名称
private Object[] values;
private CompoundVariable first,second;
@Override
public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException {
System.out.println("execute");
first=(CompoundVariable)(values[0]);
second=(CompoundVariable)(values[1]);
System.out.println("第一个参数"+first);
System.out.println("第二个参数"+second);
int result=new Integer(first.execute().trim())+
new Integer(second.execute().trim());
System.out.println("和是:"+result);
return String.valueOf(result);
}