使用Java来实现JMeter自定义函数助手

简介: 使用Java来实现JMeter自定义函数助手

大家都知道JMeter是用来进行接口测试的,但是有些页面往往在前端(比如JavaScript)经过一些处理后再把数据发给后端。这种情况应该如何处理?下面是一个网页的登录界面。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>密码进行MD5加密</title>
<script type="text/javascript" src="js/sh256.js"></script>
<script type="text/javascript" >
function SH256Password ()
{
  document.forms["myForm"]["password"].value = SHA256(document.forms["myForm"]["password"].value);
  return true;
}
</script>
</head>
<form method="post" action="jsp/index.jsp" name="myForm" onsubmit="return SH256Password()">
  姓名:<input type="text" name="username" maxlength="50" value=""><br>
  密码:<input type="password" name="password" maxlength="50" value=""><br>
  保留时间:
  <select name="time">
  <option value ="360">一小时</option>
  <option value ="8640">一天</option>
  <option value="259200">30天</option>
  <option value="1576800">半年</option>
  </select>
  <input type="submit" value="登录">
</form>
<p><a href="email.html">通过Email找回密码</a></p>
<p><a href="phone.html">通过短信验证码找回密码</a></p>
 </body>
</html>


用户输入的密码,经过JavaScript的SH256进行传输给后端,现在在JMeter中有自定义函数digest可以进行处理,如下图所示:

 

image.png


假设JMeter系统没有提供这个散列算法,或者产品使用了其他自己定义的散列算法,我们该如何处理呢?本文主要来进行这方面的介绍。


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

 

image.png


建立SHA256.java(这里我仍旧以SHA256作为案例,大家可以根据自己的情况书写相应的代码) ,代码如下:


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 parameters) throws InvalidVariableException:设置参数
  • public String getReferenceKey():获得参考关键字
  • public List getArgumentDesc():获取参数描述


书写完毕,可以建立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);
  }
}


测试通过

 

image.png


会有:

image.png


将其导出为jar文件。

File->export

选择JAR file,点击【Next>】


image.png


选择书写的代码SHA256.java(不要选择JUnit测试代码SHA256Test.java)。把生成好的jar包放在JMeter产品代码中lib/ext目录下。重新启动JMeter,就可以在函数助手中找到这个函数。

 

image.png


我们用这个函数来进行接口测试。

 

image.png


测试结果是正确。

 

image.png

目录
相关文章
|
8月前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
282 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
8月前
|
算法 Java Serverless
Java自定义函数——使用说明
Java自定义函数——使用说明
129 0
|
Java Shell Linux
Jmeter运行java程序的一个方法
Jmeter运行java程序的一个方法
Jmeter运行java程序的一个方法
|
前端开发 算法 JavaScript
JMeter的Java Request实现
JMeter的Java Request实现
169 0
JMeter的Java Request实现
|
Java 测试技术
JMeter 中实现发送Java请求
JMeter 中实现发送Java请求
197 0
EMQ
|
网络协议 Java 数据库连接
JMeter 扩展开发:自定义 Java Sampler
本文是开源测试工具JMeter扩展性开发教程第二期,主要讲解JMeter如何实现对新协议的支持。以MQTT协议中的连接为例,介绍使用JMeter Java Sampler进行扩展开发的具体步骤。
EMQ
362 0
JMeter 扩展开发:自定义 Java Sampler
|
网络协议 IDE Java
JMeter中java request测试环境配置
JMeter中java request测试环境配置
183 0
JMeter中java request测试环境配置
EMQ
|
安全 IDE Java
JMeter扩展开发:自定义函数
本文介绍了如何利用JMeter的扩展性来实现自定义的函数,用户可以通过此方式扩展出性能测试过程中所需要的函数功能。
EMQ
125 0
JMeter扩展开发:自定义函数
|
Java 编译器 API
Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口
Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口
Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口