jmeter基于java二次开发
前言
针对非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包后,测试
到此演练结束
posted on 2021-10-17 18:11 jiapengchu 阅读(712) 评论(0) 编辑 收藏 举报