jmeter 二次开发详解
背景:
JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求。通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求。例如,可能需要添加自定义的
测试元件、报告生成器或结果分析器等。二次开发三种方式:
- 自定义 BeanShell 功能
- 自定义请求编写(Java Sampler)
- 自定义函数助手
自定义 BeanShell 功能
在 JMeter 中,可以使用 BeanShell 脚本来进行自定义脚本编写和执行。BeanShell 是一种基于 Java 的脚本语言,它允许在 JMeter 中编写脚本以扩展功能或实现特定的行为。相当于一
个小巧的 Java 源码解释器,简单来说就是你可以在里面写代码,然后通过 Beanshell 翻译成插件可以识别的指令去执行相关操作。
1. 配置元件中的 BeanShell 功能:
在 JMeter 的配置元件中,可以使用 BeanShell 功能来设置变量、生成动态数据或执行其他自定义逻辑。例如,想要在每个线程中生成一个随机数,并将其存储在一个变量中,可以使
用以下 BeanShell 脚本:
int randomNumber = (int) (Math.random() * 100);
vars.put("randomNumber", String.valueOf(randomNumber));
在 BeanShell 脚本中,可以使用常规的 Java 语法和函数,以及 JMeter 提供的特定函数和变量。在上面的示例中,我们使用 Math.random() 函数生成一个随机数,并将其存储在名为 randomNumber 的 JMeter 变量中。
2. 前置处理器和后置处理器中的 BeanShell 功能:
BeanShell 最常被用于对请求或者返回内容进行获取或者加工,其中 prev 是对当前的取样进行访问,执行了对响应状态码、响应信息、请求头等的操作,示例如下:
log.info("code is "+prev.getResponseCode());
#获取响应的状态码
log.info("response is "+prev.getResponseDataAsString());
#获取响应信息
log.info("content_type "+prev.getContentType());
#获取头文件中ContentType类型
log.info("header "+prev.getRequestHeaders());
#获取取样器请求首部字段
JMeter 调用 BeanShell 解释器来运行脚本,虽然好用,但不建议频繁使用, 因为在 JMeter 高并发时,它将会消耗较多的本地资源,所以一般遇到逻辑相对复杂且代码量较大的
情况,我们会使用 JMeter 的另一种功能:开发自定义插件(jar 形式),一般来说自定义的插件会帮助我们实现两方面功能:
- JMeter 本身需要自行拓展的请求或者不支持的测试协议,我们可以使用 Java 请求来完成;
- 自定义辅助函数,协助我们进行性能测试。
自定义请求编写(Java Sampler)
实现 Java Sampler 功能的两种方式
- 继承 AbstractJavaSamplerClient 抽象类;
- 实现 JavaSamplerClient 接口。
通过阅读源码可以发现 AbstractJavaSamplerClient 抽象类是 JavaSamplerClient 接口的子类,其中 JavaSamplerClient 接口中四个主要方法是:
1. setupTest(JavaSamplerContext):
setupTest 方法在执行测试之前被调用,用于初始化资源或设置必要的前置条件。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置
等的上下文信息。在 setupTest 方法中,您可以执行一次性的初始化操作,例如建立数据库连接、创建 HTTP 客户端等。这个方法只会在整个测试计划的生命周期内调用一次。
2. getDefaultParameters():
getDefaultParameters 方法用于定义默认的请求参数。它返回一个 JMeterArgumentsArray 对象,该对象包含了请求参数的默认值和描述。这些默认参数将显示在 JMeter 的用户界面中,用户可以根据需要进行修改。通过这个方法,您可以为您的自定义 Java Sampler 提供默认的请求参数,使其易于配置和使用。
3. getSampleVariables():
getSampleVariables 方法返回一个字符串数组,其中包含您希望在请求执行期间保存的变量名。这些变量将存储在 JMeter 的 SampleResult 对象中,供其他组件使用。通过这个方法,您可以指定自定义 Java Sampler 生成的变量,以便在测试计划中的其他组件中进行引用和使用
4. runTest(JavaSamplerContext):
runTest 方法是最重要的方法,它包含了自定义请求逻辑的实现。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置等的上下文信息。在 runTest 方法中,您可以编写自定义的请求逻辑,例如执行 HTTP 请求、数据库查询或其他自定义操作。您可以使用 JMeter 提供的 API 来访问请求参数、变量、结果收集器等,并使
用 SampleResult 对象设置请求结果、响应消息和状态码等。
案例:使用 JavaSampler 重写 HTTP 的 POST 请求
//HttpClients提供功支持 HTTP 协议的客户端工具
httpClient = HttpClients.createDefault();
//新建一个HttpPost请求的对象将url,接口参数等信息传给这个对象
HttpPost httpPost = new HttpPost(URL);
//传入请求参数
httpPost.setEntity(new UrlEncodedFormEntity(Value, UTF8_CHARSET));
// 设置header信息,指定报文头Content-type等
httpPost.setHeader("Content-type", "xxxxx");
// 执行请求操作,并拿到结果
response = httpClient.execute(httpPost);
(2)接下来实现 JavaSamplerClient 接口,这是编写 Java Sampler 插件需要实现的核心接口,涉及的方法是 getDefaultParameters() 和 runTest(),作用上文已经描述过。下面带你来看具体怎么使用的,如下代码所示:
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("url","127.0.0.1:9081");
arguments.addArgument("username", "zhangtian");
arguments.addArgument("password", "12345");
return arguments;
}
(3)在上一步骤进行了参数的输入,接下来实现接收这些参数,并进行参数的输入、发送、返回判断等。runTest 方法中,主要编写自己的请求逻辑 如下代码所示:
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
//生成sampleResult对象,用于请求的命名、标记状态、添加返回内容等
SampleResult sampleResult=new SampleResult();
sampleResult.setSampleLabel("cctester_login");
//调用上文中实现的post请求
PostTest postTest=new PostTest();
//接受JMeter界面上传输的参数
String username = javaSamplerContext.getParameter("username");
String password = javaSamplerContext.getParameter("password");
String url = javaSamplerContext.getParameter("url");
//标记请求开始
sampleResult.sampleStart();
try {
HttpResponse result =postTest.Request(url,username,password);
String entity= EntityUtils.toString(result.getEntity());
//根据返回内容判断结果状态并展示结果
if (result.getStatusLine().getStatusCode()==200){
sampleResult.setSuccessful(true);
sampleResult.setResponseCodeOK();
sampleResult.setResponseData(entity, "utf-8");
}else {
sampleResult.setSuccessful(false);
sampleResult.setResponseData(entity, "utf-8");
)
(4)将 Java 类编译为 JAR 文件,并将该 JAR 文件放置在 JMeter 的 lib/ext 目录中,以便 JMeter 可以加载它
自定义函数助手
1)引入 Maven 包,这个包会给我们提供函数助手开发相关的类,如下代码所示:
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>5.3</version>
</dependency>
(2)新建类包,新建的包名字只能是 functions 结尾,否则打包放到 JMeter 中是没有办法识别这个插件的,然后代码中继承 AbstractFunction 类就可以实现,主要实现以下方法。
public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称
public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示
public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入
public String execute(SampleResult sampleResult, Sampler sampler){} // 根据入参,执行核心逻辑,保存结果至相应的变量中
jmeter 二次开发详解的更多相关文章
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
- wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解
目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...
- EasyPR--开发详解(6)SVM开发详解
在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...
- 基于H5的微信支付开发详解
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- ****基于H5的微信支付开发详解[转]
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- javacv开发详解之1:调用本机摄像头视频(建议使用javaCV1.3版本)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
随机推荐
- SqliLabs 第六关 报错注入!!!
点开网址,首先看到一个页面,首先尝试闭合字符 id=1 报错 id=1' 报错 id=1"成功 然后开始爆字段?id=1" order by 3 --+ 发现有三个字段然后查询显示 ...
- js 字符串格式数组转为数组对象
工作中经常会遇到将json字符串转换为json对象,但是将字符串格式数组转为数组对象的场景却不多 如: 其中label_exp: "["cap_pop","wk ...
- Bash 编程
原文:https://seankross.com/the-unix-workbench/bash-programming.html[1] 数学 创建math.sh: #!/usr/bin/env ba ...
- 解决google翻译出错问题
解决google翻译问题 一.为什么失效 因为google把google翻译的API给关闭了,导致翻译不了. 据网上说是服务器耗钱,但盈利不够导致的. 二.可修复的前提 国内还存有服务器可以用API ...
- .NET周报 【6月第2期 2023-06-11】
国内文章 如何计算一个实例占用多少内存? https://www.cnblogs.com/artech/p/size-calculation.html 我们都知道CPU和内存是程序最为重要的两类指标, ...
- PostgreSQL 12 文档: 部分 II. SQL 语言
部分 II. SQL 语言 这部份描述在PostgreSQL中SQL语言的使用.我们从描述SQL的一般语法开始,然后解释如何创建保存数据的结构.如何填充数据库以及如何查询它.中间的部分列出了在SQL命 ...
- 开发中MongoDB遇到的各种问题
目录 一.安装6版本以下 二.安装6版本及以上 三.安装6版本以下(解压版) 四.配置本地 Windows MongoGB 服务 五.navicat 连接远程mongodb数据库 六.ip不一致问题 ...
- 电子表格vlookup函数使用
vlookup是常用的辅助查找函数,但是这个函数的参数定义和解释非常的难以理解,即使用向导也很难搞清楚哪个参数是啥意思.放到编程圈里面应该也算bad design的典型了.下面是函数的定义,每次看到这 ...
- 【Kubernetes】yaml文件编写 -- 持续更新
K8S通过yaml格式的声明式API与资源对象交互 API版本由apiVersion字段指定,API对象类型由kind字段指定 除此之外,每个API对象有三大类属性: metadata:元数据 spe ...
- JavaScript进阶指南: DOM与BOM操作,从初学者到专家,一步也能登天一篇文章就足够了
DOM与BOM操作 复习链接: http://c.biancheng.net/view/9360.html 事件对象: https://www.runoob.com/jsref/dom-obj-eve ...