【Jmeter】深度解剖Jmeter的二次开发

目录

  • 前言
    • [一、 配置元件中的 BeanShell](#一、 配置元件中的 BeanShell)
    • [二、前置处理器和后置处理器中的 BeanShell](#二、前置处理器和后置处理器中的 BeanShell)
    • [三、自定义请求编写(Java Sampler)](#三、自定义请求编写(Java Sampler))
      • [3.1 setupTest(JavaSamplerContext)](#3.1 setupTest(JavaSamplerContext))
      • [3.2 getDefaultParameters()](#3.2 getDefaultParameters())
      • [3.3 getSampleVariables()](#3.3 getSampleVariables())
      • [3.4 runTest(JavaSamplerContext)](#3.4 runTest(JavaSamplerContext))
    • [四、测试案例使用 JavaSampler 重写 HTTP 的 POST 请求](#四、测试案例使用 JavaSampler 重写 HTTP 的 POST 请求)
    • 五、自定义函数助手

前言

JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求。通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求。例如,可能需要添加自定义的

测试元件、报告生成器或结果分析器等。二次开发三种方式:

  • 自定义 BeanShell 功能
  • 自定义请求编写(Java Sampler)
  • 自定义函数助手
  • 自定义 BeanShell 功能

在 JMeter 中,可以使用 BeanShell 脚本来进行自定义脚本编写和执行。BeanShell 是一种基于 Java 的脚本语言,它允许在 JMeter 中编写脚本以扩展功能或实现特定的行为。相当于一

个小巧的 Java 源码解释器,简单来说就是你可以在里面写代码,然后通过 Beanshell 翻译成插件可以识别的指令去执行相关操作。

一、 配置元件中的 BeanShell

在 JMeter 的配置元件中,可以使用 BeanShell 功能来设置变量、生成动态数据或执行其他自定义逻辑。例如,想要在每个线程中生成一个随机数,并将其存储在一个变量中,可以使

用以下 BeanShell 脚本:

java 复制代码
int randomNumber = (int) (Math.random() * 100);
vars.put("randomNumber", String.valueOf(randomNumber));

在 BeanShell 脚本中,可以使用常规的 Java 语法和函数,以及 JMeter 提供的特定函数和变量。在上面的示例中,我们使用 Math.random() 函数生成一个随机数,并将其存储在名为 randomNumber 的 JMeter 变量中。

二、前置处理器和后置处理器中的 BeanShell

BeanShell 最常被用于对请求或者返回内容进行获取或者加工,其中 prev 是对当前的取样进行访问,执行了对响应状态码、响应信息、请求头等的操作,示例如下:

复制代码

java 复制代码
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 接口中四个主要方法是:

3.1 setupTest(JavaSamplerContext)

setupTest 方法在执行测试之前被调用,用于初始化资源或设置必要的前置条件。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置

等的上下文信息。在 setupTest 方法中,您可以执行一次性的初始化操作,例如建立数据库连接、创建 HTTP 客户端等。这个方法只会在整个测试计划的生命周期内调用一次。

3.2 getDefaultParameters()

getDefaultParameters 方法用于定义默认的请求参数。它返回一个 JMeterArgumentsArray 对象,该对象包含了请求参数的默认值和描述。这些默认参数将显示在 JMeter 的用户界面中,用户可以根据需要进行修改。通过这个方法,您可以为您的自定义 Java Sampler 提供默认的请求参数,使其易于配置和使用。

3.3 getSampleVariables()

getSampleVariables 方法返回一个字符串数组,其中包含您希望在请求执行期间保存的变量名。这些变量将存储在 JMeter 的 SampleResult 对象中,供其他组件使用。通过这个方法,您可以指定自定义 Java Sampler 生成的变量,以便在测试计划中的其他组件中进行引用和使用

3.4 runTest(JavaSamplerContext)

runTest 方法是最重要的方法,它包含了自定义请求逻辑的实现。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置等的上下文信息。在 runTest 方法中,您可以编写自定义的请求逻辑,例如执行 HTTP 请求、数据库查询或其他自定义操作。您可以使用 JMeter 提供的 API 来访问请求参数、变量、结果收集器等,并使

用 SampleResult 对象设置请求结果、响应消息和状态码等。

四、测试案例使用 JavaSampler 重写 HTTP 的 POST 请求

1)首先我们来完成 POST 请求的核心方法,先使用 HttpClients 发送构建的 POST 数据包,然后获取到返回值,这一步是完成 POST 请求的基本步骤,示例代码如下:

java 复制代码
//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(),作用上文已经描述过。下面带你来看具体怎么使用的,如下代码所示:

java 复制代码
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 方法中,主要编写自己的请求逻辑 如下代码所示:

java 复制代码
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 包,这个包会给我们提供函数助手开发相关的类,如下代码所示:

java 复制代码
<dependency>

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

    <artifactId>ApacheJMeter_functions</artifactId>

    <version>5.3</version>

</dependency>

(2)新建类包,新建的包名字只能是 functions 结尾,否则打包放到 JMeter 中是没有办法识别这个插件的,然后代码中继承 AbstractFunction 类就可以实现,主要实现以下方法。

java 复制代码
   public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称
 
  public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示
  
  public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入
  
   public String execute(SampleResult sampleResult, Sampler sampler){}  // 根据入参,执行核心逻辑,保存结果至相应的变量中
相关推荐
m0_748237057 分钟前
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
jmeter·中间件·性能优化
Octopus207718 分钟前
【Linux】git操作
linux·笔记·git·学习
林政硕(Cohen0415)2 小时前
Repo管理
git·嵌入式·repo
“αβ”2 小时前
解决 Linux git push 成功后(但没有出现绿点)的问题
git
陵易居士15 小时前
鼠标右键单击Git Bash here不可用
git
柠檬不萌只是酸i18 小时前
day10性能测试(2)——Jmeter
jmeter·jmeter参数化·jmeter线程组·查看结果树
xxhhdd18 小时前
jmeter配置
jmeter
大霞上仙18 小时前
jmeter 提取数据写入文件
jmeter