jmeter 二次开发详解

这篇具有很好参考价值的文章主要介绍了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 请求

 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 目录中,以便 JMeter 可以加载它

自定义函数助手

1)引入 Maven 包,这个包会给我们提供函数助手开发相关的类,如下代码所示:

<dependency>

    <groupId>org.apache.jmeter</groupId>

    <artifactId>ApacheJMeter_functions</artifactId>

    <version>5.3</version>

</dependency>

(2)新建类包,新建的包名字只能是 functions 结尾,否则打包放到 JMeter 中是没有办法识别这个插件的,然后代码中继承 AbstractFunction 类就可以实现,主要实现以下方法。文章来源地址https://www.toymoban.com/news/detail-631476.html

   public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称
  public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示
  public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入
public String execute(SampleResult sampleResult, Sampler sampler){} // 根据入参,执行核心逻辑,保存结果至相应的变量中

到了这里,关于jmeter 二次开发详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jmeter 二次开发 函数助手 AES加解密

    IDE :IntelliJ IDEA 2021.1.1 x64 JAVA环境 :jdk1.8.0_251 离线导包 :导入Jmeter安装目录下lib/ext下的ApacheJmeter_function.jar 和 ApacheJmeter_cotre 重点 : 程序依赖的jar包需要放在ext路径下 程序依赖的class需要放在 ApacheJmeter_function 中,和新开发的class放在同级 以AES CBC加密为例 https://download.csd

    2024年02月12日
    浏览(42)
  • Idea Maven 构建,运行Java程序,二次开发Jmeter

    【官网】https://maven.apache.org/download.cgi 【其他版本】https://dlcdn.apache.org/maven/maven-3/ 在Idea界面上关闭所有项目,全局配置: Ctrl + Alt + S 打开设置,搜索maven,配置如下 2. 配置运行程序Runner 【阿里云效】https://developer.aliyun.com/mvn/guide 右击Java - New - Package 输入package名称 - 新建Ja

    2024年02月11日
    浏览(44)
  • jmeter5.5修改字体大小和背景颜色

    在bin目录下打开jmeter.properties 1.调整放大比例(分辨率设置) 2.改变“消息体数据”(BodyData)代码字体大小 3.修改工具栏比例 4.修改左侧树结构比例 重启jmeter 如果没生效,试试这个方法

    2024年02月16日
    浏览(35)
  • jmeter随记3:常用jmeter功能(附带场景)

    一、jmeter其他特性 1、请求的接口有多个 且 域名相同 可以写到http请求默认值里【主要填写的部分:通讯协议,请求的内容编码,服务器域名】; 创建路径:在 testplan 右键 add- Config Element - HTTP Request Defaults 内容面板数值设置示例: 这样http请求就不需要写域名了,只需要写请

    2024年02月16日
    浏览(29)
  • JMeter从入门到精通--开始你的第一个JMeter脚本

    JMeter是一款在国外非常流行和受欢迎的开源性能测试工具,像LoadRunner 一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能,但是这个功能并不好用。所以在本文中介绍一个更为常用的方法——使用Badboy录制生成 JMeter 脚本。 简单的介绍一下

    2024年02月09日
    浏览(328)
  • Jmeter常用功能-参数化介绍

    JMeter也有像LR中的参数化,本篇就来介绍下JMeter的参数化如何去实现。 参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。 这个时候就需要对用户名和密码进行参数化,使每个虚拟

    2024年02月12日
    浏览(39)
  • Jmeter(二十六)、详解jmeter函数和变量

    详解JMeter函数和变量(1) JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用。函数调用的语法如下: ${__functionName(var1,var2,var3)}  其中,__functionName匹配被调用的函数名称。用圆括号包含函数的形参,例如${__time(YMD)},不同函数要求的参数也不

    2024年02月11日
    浏览(36)
  • Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

    现在想对一个接口做性能测试,需要测试它多个线程并发下的调用 略 一个完整的http接口包含请求头和请求,这里就需要两个组件:HTTP request、HTTP Header Manager。 2-1 HTTP request 需要填写以下内容。 2-2 HTTP Header Manager 这里需要关注的是X-XSRF-TOKEN,它是动态的。 如果是第一次发请

    2024年02月13日
    浏览(34)
  • 功能强大:JMeter 常用插件全解析

    JMeter 作为一个开源的接口性能测试工具,其本身的小巧和灵活性给了测试人员很大的帮助,但其本身作为一个开源工具,相比于一些商业工具(比如 LoadRunner),在功能的全面性上就稍显不足。这篇博客,就介绍下 JMeter 的一些常用插件。 🎯 1:JMeter Plugins Manager 从 JMeter Pl

    2024年01月22日
    浏览(38)
  • JMeter做http接口功能测试

    1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求;填写服务器域名或IP;方法选POST;填写路径;在参数区域选Body Data标签;写入

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包