前言
针对非http协议需要进行测试,对于这些协议,市场上可能没有现成的工具可以直接使用。这时候我们就可以通过编写相应的Java采样器来做自己的工作,高效的进行性能测试工作。
环境准备
java环境已经搭建好了
jmeter环境已经搭建好了
idea开发环境已经配置
二次开发前提
- 需要 lib/ext 中的 Apache JMeter_core.jar
- 扩展 Java 请求也需要 Apache JMeter_ java.jar
- 扩展 HTTP 请求需要 Apache JMeter_ http.jar
- 导入jar包,自己导入
对应maven库用到的库有
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<!--scope>provided</scope-->
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<!--scope>provided</scope-->
<version>4.0</version>
</dependency>
Jmeter Java 采样器
public Arguments getDefaultParameters(); 可选,定义可用参数和默认值,获取接口参数;
public void setupTest(JavaSamplerContext arg0);可选, 初始化工作相当于setUp();
public SampleResult runTest(JavaSamplerContext arg0);必选, 相当于 Action;
public void teardownTest(JavaSamplerContext arg0);可选, 相当于 tearDown();
方法执行顺序
getDefaultParameters() > setupTest(JavaSamplerContext arg0) > runTest(JavaSamplerContext arg0) > teardownTest(JavaSamplerContext arg0)
常用方法
- addArgument("name", "value") 定义参数
- sampleStart()定义了一个事务的开始,类似于lr_start_transaction的LR,就像LR一样,事务之间不要放不相关的代码
- sampleEnd() 定义一个事务的结束,类似于lr_end_transaction的LR
- setSuccessful(true, false) 设置运行结果的成功或失败。Jmeter统计成功和失败的次数,可以反映在聚合报告中。
类继承
做二次开发的时候,大家都知道自己定义的类需要继承AbstractJavaSamplerClient,但是大家要知道为什么要继承这个类而不是其他类。为了更清楚的理解代码,我们来看一下代码如下:
public abstract class AbstractJavaSamplerClient implements JavaSamplerClient {
private static final Logger log = LoggerFactory.getLogger(AbstractJavaSamplerClient.class);
private static final org.apache.log.Logger oldLogger = LoggingManager.getLoggerForClass();
public AbstractJavaSamplerClient() {
}
public void setupTest(JavaSamplerContext context) {
log.debug(this.getClass().getName() + ": setupTest");
}
public void teardownTest(JavaSamplerContext context) {
log.debug(this.getClass().getName() + ": teardownTest");
}
public Arguments getDefaultParameters() {
return null;
}
/** @deprecated */
@Deprecated
protected org.apache.log.Logger getLogger() {
return oldLogger;
}
protected Logger getNewLogger() {
return log;
}
}
从上面的代码我们可以看出,有构造方法和三种常用方法。这三种方法熟悉吗?是的,前面已经提到过。但是,仍然缺少一个 runTest 方法,那么它在哪里呢?它必须在此类 JavaSamplerClient 中。让我们继续代码如下:
public interface JavaSamplerClient {
void setupTest(JavaSamplerContext var1);
SampleResult runTest(JavaSamplerContext var1);
void teardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters();
}
好了,既然知道了这四种方法的来源,在自己的类中,来实现功能,其实就可以重写这四种方法来实现自己的功能了。有了思路,我们真的来写个demo。
输出两个参数,
package com.czq.com;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
/**
* @author_router: jiapengchu
* @date: 2021-10-17
*
*/
public class PalindromeDemo extends AbstractJavaSamplerClient {
private String name;
private int age;
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("name","tom");
params.addArgument("age","18");
return params;
}
}
导出jar 包放到 lib/ext 目录下查看
完整代码
package com.czq.com;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
/**
* @author_router: jiapengchu
* @date: 2021-10-17
*
*/
public class PalindromeDemo extends AbstractJavaSamplerClient {
// 声明变量
private String name;
private String age;
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
// 设置参数
params.addArgument("name","tom");
params.addArgument("age","18");
return params;
}
@Override
public void setupTest(JavaSamplerContext arg0) {
// 获取变量值
name = arg0.getParameter("name");
age = arg0.getParameter("age");
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
// 逻辑处理
sr.setSamplerData("Request parameters name The values of are:"+name);
sr.setSamplerData("Request parameters age The values of are:"+age);
try{
// jmeter start statistics response time mark \
sr.sampleStart();
int iage = Integer.parseInt(age);
if(iage<0){
sr.setResponseData("age can not be possive number","utf-8");
sr.setSuccessful(false);
}
else if(iage==0) {
sr.setResponseData("age must be >0","utf-8");
sr.setSuccessful(false);
}else {
sr.setResponseData(name+"恭喜,注册成功","utf-8");
sr.setSuccessful(true);
}
} catch(Throwable e) {
sr.setSuccessful(false);
e.printStackTrace();
}finally {
sr.sampleEnd();
}
return sr;
}
}
导出jar包后,测试
到此演练结束