Jmeter二次开发——基于Java请求
简述
这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc、mq、缓存等。对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaSampler来高效地开展性能测试工作。
环境准备
- java环境已搭建ok
- jmeter环境已搭建ok
- idea开发环境已配置ok
java和jmeter环境搭建,可参考Jmeter——环境搭建
二次开发
二次开发前提
- 需要lib/ext中的ApacheJMeter_core.jar
- 扩展java请求则还需要ApacheJMeter_java.jar
- 扩展http请求则需要ApacheJMeter_http.jar
导入jar包,自行导入,可参考IDEA的基本操作——导入导出jar包
Jmeter Java Sampler
方法简介
public Arguments getDefaultParameters(); 可选,定义可用参数及默认值,获取界面的参数;
public void setupTest(JavaSamplerContext arg0); 可选,测试前执行,做一些初始化工作,类似于LR的init和Junit中的setUp();
public SampleResult runTest(JavaSamplerContext arg0); 必选,实现自定义请求,类似于LR的Action;
public void teardownTest(JavaSamplerContext arg0); 可选,测试结束时调用,类似于LR的end和Junit中的tearDown();
方法执行顺序
getDefaultParameters() > setupTest(JavaSamplerContext arg0) > runTest(JavaSamplerContext arg0) > teardownTest(JavaSamplerContext arg0)
常用方法
- addArgument("name", "value") 定义参数
- sampleStart() 定义事务的开始,类似于LR的lr_start_transaction,和LR一样事务间不要放无关代码
- sampleEnd() 定义事务的结束,类似于LR的lr_end_transaction
- 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;
}
}
我们从上述代码看到有构造方法,3个普通方法,这3个方法是不是似曾相识?是的,在前文中就有提到。但发现,还少一个runTest方法,那它在哪呢?想必就是在这个类JavaSamplerClient中了。我们继续来看代码,如下所示:
public interface JavaSamplerClient {
void setupTest(JavaSamplerContext var1);
SampleResult runTest(JavaSamplerContext var1);
void teardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters();
}
好了,现在知道4个方法的来源了,在自己类中,实现功能,其实就是将这4个方法重写,来实现自己的功能即可。思路有了,我们就来真实来写个demo吧。
getDefaultParameters
编写getDefaultParameters()方法,使用addArgument方法,设置入参,代码示例如下:
/**
* 这个方法是用来自定义java方法入参的
* params.addArgument("x","");表示入参名字叫x,默认值为空。
* @return
*/
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("x","");
return params;
}
该参数设置,在jmeter界面中会展示,如下所示:
setupTest
setupTest,做自动化、性能测试都有类似概念,就是在测试前执行,做一些初始化工作。示例代码如下所示:
/**
* 每个线程测试前执行一次,做一些初始化工作
* 获取输入的参数,赋值给变量,参数也可以在下面的runTest方法中获取,这里是为了展示该方法的作用
* @param arg0
*/
@Override
public void setupTest(JavaSamplerContext arg0) {
x = arg0.getParameter("x");
}
runTest
runTest是代码逻辑处理部分,示例代码实现的功能就是做数字简单的比较,demo而已,具体如下所示:
/**
* 真正执行逻辑的方法
* @param arg0
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
sr.setSamplerData("请求参数x的值为:"+x);
try {
// jmeter 开始统计响应时间标记
sr.sampleStart();
int sum = Integer.parseInt(x);
if (sum<0){
logger.info(sum + "<0的值是"+ "-1");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"-1", "utf-8");
//设置响应失败
sr.setSuccessful(false);
}
else {
String str = String.valueOf(x);
final StringBuilder builder = new StringBuilder(str);
if (builder.reverse().toString().equals(str)) { //reverse 字符串反转,比如输入66,反转后为66,再做比较
logger.info(sum + ">0的值做比较后是"+ "0");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"0", "utf-8");
sr.setDataType(SampleResult.TEXT);
}else {
logger.info(sum + ">0的值是"+ "1");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"1", "utf-8");
}
//设置响应执行成功
sr.setSuccessful(true);
}
} catch (Throwable e) {
//有异常,执行失败
sr.setSuccessful(false);
e.printStackTrace();
} finally {
// jmeter 结束统计响应时间标记
sr.sampleEnd();
}
return sr;
}
teardownTest
teardownTest,与setupTest是对应关系,做自动化、性能测试都有类似概念,就是在测试结束后执行,做一些清理工作。示例代码如下所示:
/**
* 测试结束后调用
* @param arg0
*/
@Override
public void teardownTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
logger.info("测试结束");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("测试结束", "utf-8");
}
完成代码编写后,可以先调试一波,确保正确后,导出jar包,放到jmeter对应目录lib/ext下。导出jar包的操作,可参考IDEA的基本操作——导入导出jar包
实际效果
说了这么多,我们来运行下代码看下实际效果,启动jmeter,添加java 请求,并选择刚编写的java方法,如下所示:
输出为-1
先来演示输出为-1的效果,我们可以从代码中看出,结果为-1,输入值小于0即可。
我们入参-9,如下所示:
运行代码,通过结果树查看请求数据,如下所示:
查看响应数据,如下所示:
我们看接口响应情况,响应是失败的,为啥是失败的呢?我们从代码可知,入参小于0时,强制设置成了响应失败,执行效果如下所示:
输出为1
再来演示输出为1的效果,我们可以从代码中看出,结果为1,输入值大于0即可。
我们入参78,如下所示:
运行代码,通过结果树查看请求数据,如下所示:
查看响应数据,响应的状态也是成功的,如下所示:
输出等于0
最后演示下输出为0的效果,我们可以从代码中看出,结果为0,输入值转换后还相等,则输出为0。
我们入参66,如下所示:
运行代码,通过结果树查看请求数据,如下所示:
查看响应数据,响应的状态也是成功的,如下所示:
完整代码
再贴下今天演示demo的完整代码,如下所示:
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.protocol.java.test.JavaTest;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
/**
* @author_router:wenyihuqingjiu
* @date:2020-12-18
*
*/
public class PalindromeDemo extends AbstractJavaSamplerClient {
private static Logger logger = LogManager.getLogger(PalindromeDemo.class.getName());
private String x;
/**
* 这个方法是用来自定义java方法入参的
* params.addArgument("x","");表示入参名字叫x,默认值为空。
* @return
*/
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("x","");
return params;
}
/**
* 每个线程测试前执行一次,做一些初始化工作
* 获取输入的参数,赋值给变量,参数也可以在下面的runTest方法中获取,这里是为了展示该方法的作用
* @param arg0
*/
@Override
public void setupTest(JavaSamplerContext arg0) {
x = arg0.getParameter("x");
}
/**
* 真正执行逻辑的方法
* @param arg0
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
sr.setSamplerData("请求参数x的值为:"+x);
try {
// jmeter 开始统计响应时间标记
sr.sampleStart();
int sum = Integer.parseInt(x);
if (sum<0){
logger.info(sum + "<0的值是"+ "-1");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"-1", "utf-8");
//设置响应失败
sr.setSuccessful(false);
}
else {
String str = String.valueOf(x);
final StringBuilder builder = new StringBuilder(str);
if (builder.reverse().toString().equals(str)) { //reverse 字符串反转,比如输入66,反转后为66,再做比较
logger.info(sum + ">0的值做比较后是"+ "0");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"0", "utf-8");
sr.setDataType(SampleResult.TEXT);
}else {
logger.info(sum + ">0的值是"+ "1");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+"1", "utf-8");
}
//设置响应执行成功
sr.setSuccessful(true);
}
} catch (Throwable e) {
//有异常,执行失败
sr.setSuccessful(false);
e.printStackTrace();
} finally {
// jmeter 结束统计响应时间标记
sr.sampleEnd();
}
return sr;
}
/**
* 测试结束后调用
* @param arg0
*/
@Override
public void teardownTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
logger.info("测试结束");
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("测试结束", "utf-8");
}
}
问题总结
运行代码,报错提示没有LoggerFactory,报错如下所示:
解决办法:重新下载slf4j包即可。
以上就是今天的分享内容了,二次开发java请求,小小demo,有误之处,望批评指正。
Jmeter二次开发——基于Java请求的更多相关文章
- jmeter二次开发之java请求
现在很多公司都用的是微服务,每个服务的请求协议有可能不相同,怎样用jmeter二次开发自己的java请求? 下面是具体的开发步骤: 1,把需要的jar包 添加到maven依赖中 jmeter中java ...
- Jmeter二次开发——自定义函数
在之前的博文中,Jmeter二次开发--基于Java请求,已介绍了Jmeter二次开发的基础情况,上次分享的是java请求开发,今天来分享下Jmeter中的函数开发.聊到Jmeter的函数,知道Jme ...
- JMeter二次开发(2)-编写 JSON Assertion 插件
本篇文章主要介绍如何对JMeter进行二次开发,添加自己所需的功能.这里以Json验证为例进行说明.在web接口测试过程中,JSON的应用已经非常普遍,但原声的JMeter并没有提供Json及Json ...
- Jmeter性能测试之如何写Java请求测试用例类
一. 引言: 最近工作中的一个项目要求做性能测试,该项目由提供服务的几个应用组成,选用的框架是阿里巴巴公司开源的服务框架Dubbo.关于Dubbo的介绍,网上也有很多资料,本人只是做了粗略的了解,没有 ...
- SSM开发基于Java EE在线图书销售系统
SSM(Spring+Spring MVC+MyBatis)开发基于Java EE在线图书销售系统 网站成功建立和运行很大部分取决于网站开发前的规划,因此为了在网站建立过程中避免一些不 ...
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...
- 基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例) 一. 案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...
- jmeter 二次开发
基于jmeter的java请求的二次开发 常用的方法: ①.addArgument("name", "value") 定义参数 ②.sampleStart ...
随机推荐
- MathType总结编辑括号的类型(中)
MathType中的符号模板多种多样,能够满足各类用户的使用需求.即使是一些不常用的符号也有相应的模板,因为在工作学习中我们都需要他们,只是有的用的多有的用的少而已,下面我们就一起来看看公式编辑器编辑 ...
- 趣文分享:C 语言和 C++、C# 的区别在什么地方?
任务: 把大象放到冰箱里.
- 在HTML中调用打开摄像头
1 <img src="imgs/qr.png" alt=""> 2 <video src=""></vide ...
- CentOS下设置ipmi
1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...
- 01_Activity生命周期及传递数据
1. Activity的生命周期: 2. Activity启动另一个Activity,并传递数据: package com.example.activitydemo; import android.a ...
- 秒极啊!手把手带你进行shiro授权拦截器的重写,学到了学到了
shiro整合前后端分离的springboots,Vue项目真的是有很多大坑啊. 今天我的主题是:如何设置shiro过滤器. 遇到问题:我的项目是前后端分离的,shiro里面有一个shiroFilte ...
- Spring Boot 集成 MQTT
本文代码有些许问题,处理方案见:解决 spring-integration-mqtt 频繁报 Lost connection 错误 一.添加配置 spring: mqtt: client: usern ...
- python核心高级学习总结7---------正则表达式
正则表达式在爬虫项目中应用很广泛,主要方面就是在字符串处理方面,经常会涉及到字符串格式的校验,用起来经常要查看文档才能完成,所以抽了个时间将正则的内容复习了一下. Start re---导入re模块使 ...
- 通过Apache Hudi和Alluxio建设高性能数据湖
T3出行的杨华和张永旭描述了他们数据湖架构的发展.该架构使用了众多开源技术,包括Apache Hudi和Alluxio.在本文中,您将看到我们如何使用Hudi和Alluxio将数据摄取时间缩短一半.此 ...
- 第11.1节 Python正则表达式概述
正则表达式是可匹配文本片段的模式,一个正则表达式指定了一个与之匹配的字符串集合.最简单的正则表达式为普通字符串,与它自己匹配.如正则表达式'python'与字符串'python'匹配.通过匹配,可以在 ...