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. 实现function的类的package声明必须包含".functions"

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

在这里插入图片描述

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("请输入第五个参数,该参数为序列的连接字符比如%、&,不填则默认为&");
         /*该描述是针对函数的输入值进行描述*/
     }


3. 这里主要是定义变量desc、KEY 然后将描述显示到函数的参数描述中,如下图


在这里插入图片描述

setParameters函数作用就是获取函数输入框界面输入的值,将输入的值传递给execute

   public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
         /*该函数用来获取输入的值*/
         /*这里,后面的1,2分别指接受的最小参数个数为1,以及接受的最大参数个数为5*/
         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],默认不填相同,如果是序列递增,只需要填否 ![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/19368007-c2ff755d94731f6c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 5、第四个参数则是用来保存整个函数封装的字符串,默认不填则会把所有字符串封装到第二个参数中,填写了则封装在该参数中,需要在body data中调用该变量,调用方式为{变量名}
6、第五个参数则为各个参数的连接方式,默认不填则为&

Jmeter.test.functions.jar下载方法见文章末尾介绍

完整源码如下:

在这里插入图片描述

如果文章对你有帮助,欢迎关注本人公众号,公众号与本平台文章同步,方便大家查阅,本人会持续推出与测试有关的文章,与大家分享测试技术,每一篇原创文章都是用心编写,杜绝抄袭复制


QQ技术交流群:加群请输入验证信息 简书
              

在这里插入图片描述


微信二维码关注公众号:

在这里插入图片描述

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkyHNY2D-1569554485737)(https://s1.51cto.com/images/blog/201908/06/2e62f8806e1dc1c391c4332ac7fd70b1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容