Jmeter3.0在函数助手中添加自定义函数

最近,群里的牛肉面大神有个需求,是将每个post请求的body部分做一个加密操作,其实这个需求不算难,用beanshell引入加密函数的包,然后调用就行了。只是,如果请求多了,每次都要调用一下自己加密函数,有点麻烦,也不利于给team内部其他人员,解决方法是把这个加密函数加到函数助手中去,这里我采用的方法是,将jmeter3.0的源代码下载下来,引入到eclipse当中,找到函数助手的包名,然后添加对应的java文件,编译,打包,再贴回到$JMETER_HOME/lib/ext/下面。网上有部分教程,但是不是很全,有些地方也没有说明白,这里我整理一下。

另外,国外的网站上说有另外一种方法,是直接写一个加密函数的java文件,包名必须名为.functions后缀,然后单独打成jar包放到$JMETER_HOME/lib/ext/,这种方法可能简单一点,然而我并没有调试成功,如果有成功的朋友可以在下方留言。

我自己的方法步骤及代码如下(关键部分代码隐去):

  • 环境准备:

    eclipse,这个就不细说了。

    Jmeter3.0的源码,下载地址是:http://jmeter.apache.org/download_jmeter.cgi,页面上下载apache-jmeter-3.0_src.zip并解压到硬盘即可。

    这里有没有ant不重要,我们这里只需要对函数助手打包即可。

  • 把Jmeter源码导入到eclipse:

    不能按照普通的导入java项目的方法导入。导入步骤如下:

    第一步:新建一个java项目,比如名字叫jmeter

    第二步:打开jmeter项目存放位置,关闭eclipse,删除jmeter目录下bin和src两个文件夹

    

    第三步:修改.classpath文件:编辑.classpath文件,用apache-jmeter-3.0_src解压文件夹中的eclipse.classpath内容替换之。

    

    第四部:重新打开eclipse,利用import导入源代码。

    

    导入过后应该是这样的:

    

    第五步:修改依赖,在build path中修改依赖包,加入$JMETER_HOME/lib下所有的jar包,同时加入$JMETER_HOME/lib/ext/ApacheJMeter_components.jar和$JMETER_HOME/lib/ext/ApacheJMeter_core.jar。

        这样差不多项目前面的感叹号就消失了。

    

到此,倒入jmeter源代码的工作就完成了,我们可以加入代码。

  • 找到src/functions,这里存放了所有函数助手中包含的函数:

    

  • 我们这里增加一个java文件,我这里命名为AbbottEncry.java,关于依赖,可以参考下其他的java文件怎么写的,贴进去就行了,当然也要引入你的方法需要用的jar包,比如我这里的加密所用的jar包。  

    具体代码如下:代码实现部分省略,前后的定义放出来供大家参考。

 1 package org.apache.jmeter.functions;
 2
 3 import java.util.Collection;
 4 import java.util.LinkedList;
 5 import java.util.List;
 6
 7 import org.apache.jmeter.engine.util.CompoundVariable;
 8 import org.apache.jmeter.samplers.SampleResult;
 9 import org.apache.jmeter.samplers.Sampler;
10 import org.apache.jmeter.threads.JMeterVariables;
11 import org.apache.jmeter.util.JMeterUtils;
12 import net.heyfinance.aes.AesCryptUtil;
13 import net.sf.json.JSONObject;
14
15 /**
16  * for Abbott
17  *
18  *
19  */
20 public class AbbottEncry extends AbstractFunction {
21
22 //    private static final String CHARSET_ENCODING = "UTF-8"; //$NON-NLS-1$
23
24     private static final List<String> desc = new LinkedList<>();
25
26     private static final String KEY = "__AbbottEncry";
27 //这个是在函数助手上显示的函数名称
28
29     static {
30         desc.add(JMeterUtils.getResString("src_body"));
31         desc.add(JMeterUtils.getResString("base_args"));
32         desc.add(JMeterUtils.getResString("encrtion_key"));
33         desc.add(JMeterUtils.getResString("encr_body"));
34 /*
35         这里4个参数,就是我们在调用函数助手时,输入的参数,这里有4个
36         src_body =  要加密的串串
37         base_args = 另外一条要加密的串串
38         encrtion_key = 加密用的key
39         encr_body = 加密后想存在jmeter中的参数名
40 */
41     }
42
43     private Object[] values;
44     public AbbottEncry() {
45     }
46
47     /** {@inheritDoc} */
48     @Override
49     public String execute(SampleResult previousResult, Sampler currentSampler)
50             throws InvalidVariableException {
51         JSONObject jsonThree = new JSONObject();
52         String encrString = ""; //$NON-NLS-1$
53         String varName = ((CompoundVariable) values[values.length - 1]).execute().trim();
54         JMeterVariables vars = getVariables();
55
56
57         String srcBody = ((org.apache.jmeter.engine.util.CompoundVariable) values[0]).execute();
58         String baseArgs = ((org.apache.jmeter.engine.util.CompoundVariable) values[1]).execute();
59         String encrKey = ((org.apache.jmeter.engine.util.CompoundVariable) values[2]).execute();
60 //把参数转换成String
61
62         //此处略去。。。
63
64         return encrString;
65     }
66
67     /** {@inheritDoc} */
68     @Override
69     public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
70         checkParameterCount(parameters, 3, 4);
71 //这里,后面的3,4是指调用函数助手时,可以接受的参数个数,低于3就不会执行(这个地方,可能解释不是很明确,后面再去看下官档)
72         values = parameters.toArray();
73 //把接受到的参数装成array,然后用value[i]取出来。
74     }
75
76     /** {@inheritDoc} */
77     @Override
78     public String getReferenceKey() {
79         return KEY;
80     }
81
82     /** {@inheritDoc} */
83     @Override
84     public List<String> getArgumentDesc() {
85         return desc;
86     }
87 }

  • 写完了以后我们可以打包了,右键src/functions用export功能达成jar包,注意3.0后,函数助手的名字叫ApacheJMeter_functions.jar。打成jar包后,放到$JMETER_HOME/lib/ext/注意备份一下原来文件。

    另外,自己的函数依赖包要放到$JMETER_HOME/lib。

    

    

  • 重新启动Jmeter就行了,我们可以看到我们需要的函数了。这里还有个小bug,暂时不知道原因,第一次进去函数助手,看到自己的函数的时候,发现参数列表是空的,我以为是程序问题,但是选择一个别的函数,然后再选回到自己的函数上,参数又出现了,并且可以正常使用,暂时不知道原因,有兴趣的朋友可以讨论下。

    

    

至此,文章结束。

时间: 2024-08-03 08:53:10

Jmeter3.0在函数助手中添加自定义函数的相关文章

shell从函数文件中调用函数

碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在下面直接调用:一种是通过载入shell,在shell中直接调用:第三种是将函数写入文件,然后在其他shell中调用函数. 这里写一下关于第三种方法的例子: is_it_a_directory() { if [ $# -lt 1 ];then echo "is_it_a_directory:I need an argument" return 1 fi _DIRECTORY_

open()函数 linux中open函数使用

来源:http://www.cnblogs.com/songfeixiang/p/3733855.html linux中open函数使用 open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值 参考格式 if(fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY))<0 {printf("cannot open"}; int open(const char

苹果浏览器Safari对JS函数库中newDate()函数中的参数的解析中不支持形如“2020-01-01”形式

苹果浏览器safari对new Date('1937-01-01')不支持,用.replace(/-/g, "/")函数替换掉中划线即可 如果不做处理,会报错:invalid date 本解决方案参考:http://stackoverflow.com/questions/4310953/invalid-date-in-safari

MySQL中concat函数(连接字符串)

MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串. 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串.一个数字参数被转化为与之相等的二进制字符串格式:若要避免这种情况,可使用显式类型 cast, 例如:SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQL的con

MySQL中concat函数

使用方法:CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串. 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串.一个数字参数被转化为与之相等的二进制字符串格式:若要避免这种情况,可使用显式类型 cast, 例如:SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQL的concat函数可以连接一个或者多

Python中的函数详解

声明:转载自伯乐在线 Python中的函数,无论是命名函数,还是匿名函数,都是语句和表达式的集合.在Python中,函数是第一个类对象,这意味着函数的用法并没有限制.Python函数的使用方式就像Python中其他值一样,例如字符串和数字等.Python函数拥有一些属性,通过使用Python内置函数dir就能查看这些属性,如下代码所示: def square(x): return x**2 >>> square <function square at 0x031AA230>

Mysql中的函数

阅读目录 什么是函数 与存储过程的区别 mysql自带函数 自定义函数 什么是函数 mysql中的函数与存储过程类似,都是一组SQL集: 与存储过程的区别 函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值: 函数可以嵌入到sql语句中使用,而存储过程不能: 函数一般用于实现较简单的有针对性的功能(如求绝对值.返回当前时间等),存储过程用于实现复杂的功能(如复杂的业务逻辑功能): mysql自带函数 mysql本身已经实现了一些常见的函数,如数学函数.字符串函

关于JS中的函数定义及函数表达式

在初学JS的过程中,老是不能区别什么是函数表达式什么是函数定义,这对基础知识的夯实是不利的.因此查阅资料,认真对其进行了区别. 简单总结如下: 1.区别一:以function开头的函数纪委函数定义,其他则为函数表达式: 2.区别二:函数表达式可以省略函数名. function FunctionName(FormalParameterList) { FunctionBody } //函数定义 function [FunctionName](FormalParameterList) { Functi

JavaScript中匿名函数的多种写法

匿名函数没有实际名字,也没有指针,怎么执行滴?  其实大家可以看看小括号的意义就应该可以理解.小括号有返回值,也就是小括号内的函数或者表达式的返回值,所以说小括号内的function返回值等于小括号的返回值,不难理解 (function(){})()可以将没有名字的函数执行了把- 关于匿名函数写法,很发散~ 最常见的用法: 代码如下: (function() { alert('water'); })(); 当然也可以带参数: 代码如下: (function(o) { alert(o); })('