news 2026/6/10 14:02:10

jmeter 二次开发详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 形式),一般来说自定义的插件会帮助我们实现两方面功能:

自定义请求编写(Java Sampler)

实现 Java Sampler 功能的两种方式

通过阅读源码可以发现 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 请求

1)首先我们来完成 POST 请求的核心方法,先使用 HttpClients 发送构建的 POST 数据包,然后获取到返回值,这一步是完成 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

AI写代码bash

目录中,以便 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){} // 根据入参,执行核心逻辑,保存结果至相应的变量中

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 5:38:17

【myTinyRtspServer】RTSP协议整理

1.RTSP协议概述 RTSP标准手册: https://datatracker.ietf.org/doc/html/rfc2326 RTSP(Real Time Streaming Protocaol),RFC2326&#xff0c;实时流传输协议&#xff0c;属于应用层协议&#xff0c;此协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结…

作者头像 李华
网站建设 2026/6/9 5:47:15

基于.Net 8创建 CAD勘测定界图(四)——填充及拉线标注

好的&#xff0c;之前的两篇文章大概介绍了一下关于做这个功能的背景和关于Aspose.CAD For .Net填充无效&#xff0c;转用ACadSharp创建红线、界址点符号、界址点标注以及边长标注的方法&#xff0c;具体看&#xff1a; 基于.Net 8创建 CAD勘测定界图&#xff08;一&#xff09…

作者头像 李华
网站建设 2026/5/27 22:20:20

02. 缓存行

1.缓存行1.缓存行 CPU读取内存时, 并不是直接一个字节一个字节地读, 而是按照内存总线的位宽(比如64位, 即8字节)来传输数据; 但是CPU的缓存系统(Cache)在从内存中加载数据时, 是以缓存行(Cache Line)为单位的a.内存总线的传输单位: "每次内存读写操作通过总线传输的数据量…

作者头像 李华
网站建设 2026/6/10 11:23:27

32、深入探索vi编辑器:参数配置与命令缩写技巧

深入探索vi编辑器:参数配置与命令缩写技巧 在UNIX系统中,vi编辑器是一款功能强大且广泛使用的工具。它提供了丰富的配置选项和灵活的命令缩写功能,能够极大地提高编辑效率。本文将详细介绍vi编辑器的参数配置和命令缩写的相关知识和操作方法。 1. 配置vi参数 vi编辑器拥有…

作者头像 李华