通过案例带你轻松玩转JMeter连载(37)

简介: 通过案例带你轻松玩转JMeter连载(37)

2函数助手的二次开发



1)下载JMeter源代码,并且把它导入到Eclipse中。然后导入JMeter产品代码中lib目录下的所有jar包(ext目录下的不要管)和JUunt5。(虽然项目中有许多红叉叉,但是只要保证src/function/src/main/java和src/function/src/test/java下没有红叉叉即可)。如图4所示。


image.png

图4 载入JMeter源代码


2)建立SHA256.java文件,代码如下。


package org.apache.jmeter.functions;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class SHA256 extends AbstractFunction{
       private static final Logger log = LoggerFactory.getLogger(SHA256.class);
    private static final List<String> desc = new LinkedList<>();    //描述
    private static final String KEY = "__SHA256";  //方法描述,必须双下划线
static {     
        desc.add(JMeterUtils.getResString("SHA256_Str_param")); //这个以后会在JMeter参数输入时提示
    }
    private Object[] values;
    public SHA256() {
    }
     private static String byte2Hex(byte[] bytes){
      StringBuffer stringBuffer = new StringBuffer();
      String temp = null;
      for (int i=0;i<bytes.length;i++){
       temp = Integer.toHexString(bytes[i] & 0xFF);
       if (temp.length()==1){
       //1得到一位的进行补0操作
       stringBuffer.append("0");
       }
       stringBuffer.append(temp);
      }
      return stringBuffer.toString();
     }
    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws 
InvalidVariableException {
           JMeterVariables vars = getVariables();
           String varName = ((CompoundVariable) values[values.length - 1]).execute().trim();
           MessageDigest messageDigest=null;
            String encodeStr = "";
            try {
                   messageDigest = MessageDigest.getInstance("SHA-256");
                   messageDigest.update(varName.getBytes("UTF-8"));
            } catch (NoSuchAlgorithmException e) {
                   e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
            }
            encodeStr = byte2Hex(messageDigest.digest());
        if (vars != null && varName != null) {
            vars.put(varName.trim(), encodeStr);
            log.info("varName:", vars.get(varName.trim()));
        }
        return encodeStr;
    }
    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws 
InvalidVariableException {
        //对入参进行检查,最小1个参数
        checkMinParameterCount(parameters,1);
        values = parameters.toArray();
    }
    @Override
    public String getReferenceKey() {
        return KEY;
    }
    @Override
    public List<String> getArgumentDesc() {
        return desc;                                                    
    }
}


其中下列四个该函数是必须有的。

  • public String execute(SampleResult previousResult, Sampler currentSampler) throws

InvalidVariableException:执行,真正函数算法所在。

  • public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException:设置参数。
  • public String getReferenceKey():获得参考关键字。
  • public List<String> getArgumentDesc():获取参数描述。


3)书写完毕,可以建立JUnit5文件进行测试。建立SHA256Test.java文件,代码如下。


package org.apache.jmeter.functions;
import static org.apache.jmeter.functions.FunctionTestHelper.makeParams;
import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Collection;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class SHA256Test {
       @BeforeEach
       void setUp() throws Exception {
        JMeterContextService.getContext().setVariables(new JMeterVariables());
}
       @AfterEach
       void tearDown() throws Exception {
              JMeterContextService.getContext().clear();
       }
       @Test
       void test() throws InvalidVariableException {
              SHA256 sha256 = new SHA256();
        Collection<CompoundVariable> params = makeParams("123456");
        sha256.setParameters(params);
        String totalString = sha256.execute();
assertEquals("8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92", 
totalString);
       }
}


4)测试通过后把SHA256.java产生的SHA256.class打成jar包放在%JMETER_HOME%\lib\ext目录下(参见第1节第2)-6)步)。


5)打开JMeter,在函数助手中找到SHA256这个函数了,如图5所示。

image.png

图5 从函数助手中获得SHA256函数


6)最后把商品列表HTTP请求中的password参数值改为:{__SHA256({pram_g1})},运行保证运行正常。

目录
相关文章
|
Java 测试技术 API
通过案例带你轻松玩转JMeter连载(49)
通过案例带你轻松玩转JMeter连载(49)
251 1
通过案例带你轻松玩转JMeter连载(49)
|
存储 Linux
通过案例带你轻松玩转JMeter连载(60)
通过案例带你轻松玩转JMeter连载(60)
179 0
通过案例带你轻松玩转JMeter连载(60)
|
算法
通过案例带你轻松玩转JMeter连载(59)
通过案例带你轻松玩转JMeter连载(59)
232 0
通过案例带你轻松玩转JMeter连载(59)
|
XML JavaScript Java
通过案例带你轻松玩转JMeter连载(58)
通过案例带你轻松玩转JMeter连载(58)
130 0
通过案例带你轻松玩转JMeter连载(58)
通过案例带你轻松玩转JMeter连载(57)
通过案例带你轻松玩转JMeter连载(57)
128 0
通过案例带你轻松玩转JMeter连载(57)
|
存储 索引
通过案例带你轻松玩转JMeter连载(56)
通过案例带你轻松玩转JMeter连载(56)
117 0
通过案例带你轻松玩转JMeter连载(56)
|
存储 Prometheus 监控
通过案例带你轻松玩转JMeter连载(55)
通过案例带你轻松玩转JMeter连载(55)
165 0
通过案例带你轻松玩转JMeter连载(55)
|
存储 监控 数据可视化
通过案例带你轻松玩转JMeter连载(54)
通过案例带你轻松玩转JMeter连载(54)
157 0
通过案例带你轻松玩转JMeter连载(54)
|
存储 Prometheus 监控
通过案例带你轻松玩转JMeter连载(53)
通过案例带你轻松玩转JMeter连载(53)
138 0
通过案例带你轻松玩转JMeter连载(53)
|
JSON 监控 数据可视化
通过案例带你轻松玩转JMeter连载(52)
通过案例带你轻松玩转JMeter连载(52)
200 0
通过案例带你轻松玩转JMeter连载(52)