Jmeter 压测实战:Jmeter 二次开发之自定义函数

目录

[1 前言](#1 前言)

[2 开发准备](#2 开发准备)

[3 自定义函数核心实现](#3 自定义函数核心实现)

[3.1 新建项目](#3.1 新建项目)

[3.2 继承实现 AbstractFunction 类](#3.2 继承实现 AbstractFunction 类)

[3.3 最终项目结构](#3.3 最终项目结构)

[4 Jmeter 加载扩展包](#4 Jmeter 加载扩展包)

[4.1 maven 构建配置](#4.1 maven 构建配置)

[4.2 项目打包](#4.2 项目打包)

[4.3 Jmeter 加载扩展包](#4.3 Jmeter 加载扩展包)

[5 自定义函数调用调试](#5 自定义函数调用调试)

[5.1 打开 Jmeter 函数助手,选择自定义函数](#5.1 打开 Jmeter 函数助手,选择自定义函数)

[5.2 京东宙斯接口验证](#5.2 京东宙斯接口验证)


1 前言

JMeter 是一个开源性能测试工具,可以帮助开发者对 Web 应用程序进行压力测试。在 JMeter 中,自定义函数是一种非常重要的功能,它可以帮助开发者实现更灵活和复杂的测试。

本文介绍如何开发 Jmeter 自定义函数实现快速生成京东宙斯下单标准 sign,同时深刻理解 Jmeter 的插件化机制及高扩展性特性。

2 开发准备

  1. Java 基础开发
  2. Maven 基本使用
  3. 开发依赖版本
    JDK 1.8.0Maven 3.6.3Jmeter 5.4.3

3 自定义函数核心实现

3.1 新建项目

  • 新建 maven 项目,这里项目名为:JSF_Sampler
  • 因为是基于 Jmeter 的扩展,需要依赖包 Jmeter 两个核心包,分别是:
  • ApacheJMeter_core
  • ApacheJMeter_java
  • ApacehJMeter_functions

pom.xml 文件核心配置如下

复制代码
<groupId>com.jd.jmeter.jsf</groupId>
<artifactId>JSF_Sampler</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jmeter-version>5.4.3</jmeter-version>
</properties>
<dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_functions</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
    </dependencies>

3.2 继承实现 AbstractFunction 类

实现类依次实现以下几个步骤

1)新建实现类并继承 AbstractFunction

  • 注意:实现类的包名必须包含 xxx.functions.xxx,Jmeter 使用命名规则实现实现类的加载。

2)重写以下方法,每个方法的用途见下方代码注释

  • execute()

  • setParameters()

  • getReferenceKey()

  • getArgumentDesc()

    复制代码
     /**
       * 京东宙斯 下单标准字段常量
       */
      private static final String APP_KEY = "app_key";
      private static final String APP_SECRET = "app_secret";
      private static final String ACCESS_TOKEN = "access_token";
      private static final String TIMESTAMP = "timestamp";
      private static final String V = "v";
      private static final String METHOD = "method";
      private static final String BUY_PARAM_JSON = "360buy_param_json";
      /**
       * Jmeter中自定义的函数名,在Jmeter的函数助手中可以看到
       */
      private static final String FUNC_NAME = "__GenSignFunction";
    
      /**
       * 自定义函数的描述,入参,出参,方便使用人员参考使用
       */
      private static final List<String> desc = new ArrayList<>();
    
      static {
          desc.add("This function is used to generate the JD's JOS sign value");
      }

    /**
    * 此为自定义函数核心实现类,其中,入参SampleResult为上次运行的结果,Sampler为当前的采集器;
    * 返回值为该函数的返回值
    * @param sampleResult
    * @param sampler
    * @return
    * @throws InvalidVariableException
    */
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
    // 入参处理
    String param = String.valueOf((CompoundVariable)paramValues[0]);
    String signResult = paramHandler(param);

    复制代码
          return signResult;
      }
    
      /**
       * 按京东宙斯sign加密规则生成标准sign
       * @param param
       * @return
       */
      public String paramHandler(String param){
          Map<String,String> valueMap = new HashMap();
          // 按&符号分割
          String[] paramArray = param.split("&");
          for (int i = 0; i < paramArray.length-1; i++) {
              String key = paramArray[i].split("=")[0];
              String value = paramArray[i].split("=")[1];
              valueMap.put(key,value);
          };
          // 京东宙斯标准sign
          String josGign = EncryptUtil.getSignature(valueMap.get("app_secret")+BUY_PARAM_JSON+valueMap.get("360buy_param_json")
          +ACCESS_TOKEN+valueMap.get("access_token")
          +APP_KEY+valueMap.get("app_key")
          +METHOD+valueMap.get("method")
          +TIMESTAMP+valueMap.get("timestamp")
          +V+valueMap.get("v")
          +valueMap.get("app_secret"));
          return josGign;
      }

    /**

    • 配置入参,jmeter函数助手入参
      /
      @Override
      public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
      paramValues = collection.toArray();
      }
      /
      *
    • 此方法返回自定义的函数名称
      /
      @Override
      public String getReferenceKey() {
      return FUNC_NAME;
      }
      /
      *
    • 此方法返回函数描述信息
      */
      @Override
      public List<String> getArgumentDesc() {
      return desc;
      }

3.3 最终项目结构

4 Jmeter 加载扩展包

以上开发完成,打包此项目,注意这里的打包要包含依赖包。

4.1 maven 构建配置

复制代码
<build>
        <finalName>${project.artifactId}</finalName>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>assemble-all</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

4.2 项目打包

复制代码
打包指令如下
mvn package -Dmaven.test.skip=true

4.3 Jmeter 加载扩展包

将打包后的扩展包放置到 Jmeter 的 ext 目录:apache-jmeter-5.4.3/lib/ext/

启动 Jmeter 后,Jmeter 会自动加载 ext 目录中的扩展包

打开 Jmeter 函数助手后,可以看到本次实现类中打印的相关日志

5 自定义函数调用调试

5.1 打开 Jmeter 函数助手,选择自定义函数

5.2 京东宙斯接口验证

这里使用京东快递获取预制运单号接口,输入 GET 请求后,直接点击运行函数【Generate & Copy to clipboard】,出参返回 32 位 sign 值。

复制代码
GET请求入参
method=jingdong.etms.waybillcode.get&app_key=349559FAE87E66826499890862E40A44&access_token=c8c2bdc8d1684630bb771a503d5b5a7fkyzh×tamp=2022-01-28 15:10:00&360buy_param_json={"preNum":"1","customerCode":"10K43816","orderType":"0"}&v=2.0&sign=EBB52C6CEDA34703ADE72D4AA4D8F316&app_secret=29959e4cadc14ff4998d4fc26d1e5063

作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

相关推荐
敲键盘的小夜猫5 分钟前
大模型链路调试平台之LangSmith实战指南
python·langchain
狐凄16 分钟前
Python实例题:Python计算概率论
开发语言·python·概率论
Leo.yuan18 分钟前
数据湖是什么?数据湖和数据仓库的区别是什么?
大数据·运维·数据仓库·人工智能·信息可视化
Y31742919 分钟前
python Day46 学习(日志Day15复习)
python·学习·机器学习
这里有鱼汤20 分钟前
一文读懂量化交易中最常用的5种均线,附源码,建议收藏
后端·python
学不会就看39 分钟前
selenium学习实战【Python爬虫】
python·学习·selenium
程序员JerrySUN39 分钟前
Linux 内核内存管理子系统全面解析与体系构建
java·linux·运维
q5673152341 分钟前
分布式增量爬虫实现方案
开发语言·分布式·爬虫·python
勤奋的知更鸟1 小时前
LLaMA-Factory和python版本的兼容性问题解决
开发语言·python·llama-factory
CIb0la1 小时前
Ai自动补全编程工具:llama vscode
运维·开发语言·学习·测试工具·程序人生