Jmeter如何实现参数名词和个数动态变化的接口请求

  • 需求分析
    在做接口自动化和性能测试,经常会遇到一些请求参数是根据上一个请求结果,动态变化的参数个数,参数名可能相同,也可能为序列递增格式,参数个数可能为10、20个,这样就导致手工不好模拟该请求效果,需要进行封装自定义函数才能实现该效果

Jmeter是一款开源的性能测试工具,目前是行业内使用率最高的性能测试工具之一,Jmeter是使用JAVA语言开发的,本文介绍如何使用JAVA语言开发自己需要的扩展函数


  • 目前业界流行的两种开发模式,本文介绍第二种
    1、使用Jmeter二次开源环境,直接在org.apache.jmeter.functions包下面开发自己需要的函数,然后导出该jar包,替换Jmeter目录的ApacheJMeter_functions.jar文件
    2、直接在Maven 项目下开发自定义函数,然后打包,该方法、简单、高效

  • 开发思路
    1、使用Eclipse创建Maven 项目,配置Pom文件,引入扩展function所需的依赖包;
    2、创建类,然后继承AbstractFunction,实现四个主方法;
    3、对编写好的项目进行编译、打包
    4、把打包好的函数放到jmeter扩展目录,调用自定义函数,检查是否正确;
JDK环境 Jmeter依赖包版本 Maven仓库版本
1.8 4.0 3.5.3

一、新建Maven项目

1.File》New》Project,选择Maven》Maven Project,一直点击Next,此处Package包名一定要以.functions格式结束,否则开发出来的函数,Jmeter读取不到


2.配置Pom文件,Pom文件配置的Jmeter4.0版本,只要保存了Pom文件,系统就会自动下载和关联相应的jar包,Pom配置文件如下:

3.保存Pom文件之后,系统会自动下载关联的依赖文件,如下图:


4.此时,由于对pom文件进行了修改,项目顶层会出现一把×,并且编译可能就会报错,需要执行Maven》Update Project更新外部依赖的Jar包

  • 更新前:

  • 更新后,编译、打包正常:

    二、编写自定义函数代码
  • 要实现扩展Jmeter function,主要有两点
    1.1. 实现function的类的package声明必须包含".functions"

    JMeter设计让一些核心的类可以在非UI的方式下运行的时候能被加载进来,这些类会被优先加载。加载这些类的时候是通过命名规则来实现的。所有实现function的类必需包含".functions",所以我们自定义实现的类里必须包含".functions",比如如下申明的包名为:"jmeter.test.functions"


1.2. 首先在Jmeter.test.functions包下创建一个类,类名称为Save_Body_Data,需要继承AbstractFunction类,然后实现父类的四个方法

      private static final List<String> desc = new LinkedList<String>();  /*该变量用来获取对参数值输入进行描述*/

      private static final String KEY = "__Media_Save_Body_Data";  /*这个是在函数助手上显示的函数名称*/

      static {
          desc.add("请输入第一个参数,类似variable=value,其中变量值可以写成变量格式,格式为${value},如果有多个参数,只需要用&连接"
                + "类似variable=value&variable1=value1,第一个参数也可以置空,然后在Body data中填写也行");
          desc.add("请输入第二个参数,该参数为变化的序列id,需要和jmeter中获取的变量名保持一致");
          desc.add("请输入第三个参数,该参数为申明重复参递增参数名是否一样,填否则序列递增,如id[0]、id[1],不填则默认相同");
          desc.add("请输入第四个参数,该参数值是用来在jmeter的Body_Data用来调用的,可以根据需要自定义,不填则默认为第二个参数名");
          desc.add("请输入第五个参数,该参数为序列的连接字符比如%、&,不填则默认为&");
          /*该描述是针对函数的输入值进行描述*/
      }
  • 这里主要是定义变量desc、KEY 然后将描述显示到函数的参数描述中,如下图
  • setParameters函数作用就是获取函数输入框界面输入的值,将输入的值传递给execute
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
          /*该函数用来获取输入的值*/
          /*这里,后面的1,2分别指接受的最小参数个数为1,以及接受的最大参数个数为2*/
          checkParameterCount(parameters,1,5);
          values = parameters.toArray();
          /*将值存入类变量中,把接受到的参数装成array,然后用value[i]取出来 */
    }
    • getReferenceKey函数是提供一个在Jmeter函数助手显示的函数名称
    public String getReferenceKey() {
          /*本方法是提供一个在Jmeter函数助手显示的函数名称*/
        return KEY;
    }
  • getArgumentDesc函数用来获取对输入参数的描述
    public List<String> getArgumentDesc() {
          /*该函数用来获取对输入参数的描述*/
        return desc;
    }
  • execute函数用来实现获取输入的参数,然后通过对参数做需要的处理,该函数是开发中最重要的模块,并且进行最后执行,本次案例中主要实现的功能就是获取上一个接口返回的变量个数,然后对获取的变量名和参数值进行封装,最后通过字符连接成我们需要的效果

三、编译、打包

  1. 编写代码完成,就可以进行编译、打包操作了,右键点击项目》Run As》Maven build
  2. 在Goals中输入package,然后点击Apply》Run执行编译,打包操作
  3. 编译打包完成,在target目录会生成一个jar包,如下图所示

    四、验证开发的函数是否正常

    1. 首先把Jmeter.test.functions函数放到jmeter的\lib\ext目录
    2. 然后启动jmeter,进入选项》函数助手对话框,选择_Media_Save_Body_Data,输入参数值,点击生成按钮(点了生成,系统就会生成一个函数,然后就相当于做了复制功能,可以拷贝到需要调用的地方)本次 只输入第二个参数值(该值必须为上一个接口定义的变量名称,稍后介绍如何使用该函数)
    3. 首先需要在上一个接口添加JSON Extractor元件,用来获取变化的参数值,
    4. 然后使用BeanShell Sampler调用生成的函数,该sample执行成功之后,就会生成我们要的字段效果
    5. 手工请求参数如下
    6. 通过代码实现的参数只需要用参数名称=值然后每个参数使用&连接即可
    7. 执行结果,如下:


      • 函数功能介绍
        1、本次开发的函数实现的效果为通过传入5个参数,其中只有第二个为必填项,其它参数可以为空
        2、第一个参数可以为空,当为空的时候,则需要把parameters中的参数和值在body data中手动写入,本次就是在body data中手工写入了不会变化的参数名,你也可以直接把这些参数传入到第一个参数,格式为funid=imp_provider&destfunid=pur_apply_provider&parentId=${apply_id}
        &pagetype=import&eventcode=import&user_id=${user}&dataType=json
        3、第二个参数为获取的变量名称,该名称一定要和jmeter中json path中定义的参数名一致,这样才能获取到jmeter中变化的参数
        4、第三个参数为判断重复变化的参数名称的格式是一样还是序列递增,比如id[0],id[1],默认不填相同,如果是序列递增,只需要填否

        5、第四个参数则是用来保存整个函数封装的字符串,默认不填则会把所有字符串封装到第二个参数中,填写了则封装在该参数中,需要在body data中调用该变量,调用方式为${变量名}
        6、第五个参数则为各个参数的连接方式,默认不填则为&

Jmeter.test.functions.jar下载方法见文章末尾介绍
完整源码如下:

***

? ?如果文章对你有帮助,可以在右下角点击关注功能,欢迎转发、拍砖,本人会持续推出与测试有关的文章,与大家分享测试技术,每一篇原创文章都是用心编写,杜绝抄袭复制,微信公众号与51cto文章同步,方便大家查阅

微信二维码关注公众号:

关注之后,回复资源下载,即可获取本人共享的各种资源下载地址



原文地址:https://blog.51cto.com/6183574/2430423

时间: 2024-10-08 22:27:57

Jmeter如何实现参数名词和个数动态变化的接口请求的相关文章

jmeter 压力测试 参数

Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅. 如果大家都是做Web应用的性能测试,例如只有一个登录的请求,那么在Aggregate Report中,会显示一行数据,共有10个字段,含义分别如下. Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 #Sam

jmeter 聚合报告参数详解及TPS 解析

1.获得TPS插件 https://www.cnblogs.com/beginner-boy/p/7806220.html  参见,已保存百度云盘 2.添加后,记得使用调度器——每秒50个并发,持续60秒,观察TPS 3.TPS,执行一次事务(包括请求.请求服务器.等待服务器返回等等,比如一个TPS事务,可能触发3个QPS请求) PS:一秒钟处理的事务数.TPS值越大,一秒钟处理的事务数就越多,说明处理速度越快,软件的效率就越好. 一.TPS:Transactions Per Second(每秒

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

JMeter实现唯一参数生成不重复时间戳

现象: 使用jmeter做接口压测时,总会遇到压测时,提示不允许重复id或提示订单不允许重复现象,那么如何解决呢? 原料工具 jmeter4.0 本地准备好接口服务 思路: 单个接口,小批量接口,一般以时间戳或者是日期格式的数据作为接口测试参数,解决参数化问题: 大批量接口压测时,这上面的时间戳方式是不行的,秒级请求或者毫秒级别的请求不能满足大批量接口压测需求,这时候需要用比毫秒小的单位纳秒再做字符串拼接 时间戳函数操作: 1.通过函数助手,生成一个_time 函数: 2.如果参数为时间戳,那公

实时监测input控件value值动态变化的事件

目录 [1]input [2]propertychange [3]兼容处理 前面的话 HTML5为input控件新增了很多type属性,大大增加了input控件的应用场景.其中一个是type="range"的input控件,可以通过拖动游标改变value值,但并不是所有浏览器都可以实时显示,除了IE10+浏览器 说到改变value值的事件,首先想到的便是change事件,但change事件的触发条件是失去焦点并且value值改变.而游标拖动并没有失去焦点.所以,change事件并不能达

python接口自动化-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)

参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了.最常见的案例就是网站的登录案例,很多网站的登录并不仅仅只传username和psw两个参数,往往有其它的动态参数.有时候还需要带上cookies参数,如JSESSIONID 登录参数 首先分析下目标网站[学信网:https://account.chsi.com.cn/passport/login]的登录接口请求参数.先随便输入账号和密码,使用fiddler工

go 动态定时任务 API 接口

go 动态定时任务 API 接口 使用 连接数据库表,启动服务 初始化所有定时任务,然后通过 API接口 动态修改 定时任务. 数据库表 CREATE TABLE `go_cron` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `time` varchar(100) DEFAULT '' COMMENT '定时时间', `ip` varchar(100) DEFAULT '' COMMENT '内网IP', `shell` varchar(5

动态调用WebService接口的几种方式

一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过来就行调用的,步骤如下: 1.找到引用,右击添加服务引用,找到高级,添加web引用,添加之后就可以直接调用里面的方法. 以上这种方法是最简单粗暴的一种方式.当然在开发中总是不那么如意,以上方式是在本机直接可以访问服务的地址,假如在本机不能直接访问WebService,那么就会有些蛋疼. 这种方式就不可取了

js实现页面时间动态变化

利用函数嵌套和setTimeout函数实现时间动态变化 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) myDate.ge