zoukankan      html  css  js  c++  java
  • Jmeter函数助手中添加自定义函数

    最近,群里的牛肉面大神有个需求,是将每个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 }
    View Code
    •  写完了以后我们可以打包了,右键src/functions用export功能达成jar包,注意3.0后,函数助手的名字叫ApacheJMeter_functions.jar。打成jar包后,放到$JMETER_HOME/lib/ext/注意备份一下原来文件。

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

        

        

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

        

        

     至此,文章结束。

  • 相关阅读:
    cf1011 E. Border
    cf 1011 D. Rocket
    cf 1011C. Fly
    cf 1015 E2. Stars Drawing (Hard Edition)
    cf 1015 E1. Stars Drawing (Easy Edition)
    Walking Between Houses(Codeforces-1015D)
    D. Vasya And The Matrix 构造
    点击数据将之前信息隐藏显示当前(手机端页面)
    连接返回上一步(上一个页面)
    公共的css样式
  • 原文地址:https://www.cnblogs.com/performancetest/p/5915943.html
Copyright © 2011-2022 走看看