Jmeter函数助手中添加自定义函数——SHA256加密

本文介绍了如何在JMeter中添加自定义函数以实现SHA256加密。首先从JMeter官网下载源码并导入Eclipse,接着在functions包下创建SHA256类,覆盖所需函数。然后导出为ApacheJMeter_functions.jar,替换JMeter的libext目录下的原有文件,重启JMeter即可使用新函数进行SHA256加密操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近测试一套接口,需要将post请求的参数按要求进行SHA256加密,正好之前已经将Jmeter的源码在eclipse中运行起来了,可以通过在org.apache.jmeter.functions下添加函数。

第一步,自然是从Jmeter官网下载src文件,并导入eclipse,我基本是参考这篇博文点击打开链接

第二步,直奔主题进行编码,在functions下添加类SHA256,贴出全部代码,就是对一些函数进行重写,不懂不会的都可以百度,我的编码水平也比较菜的。


package org.apache.jmeter.functions;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

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.Logge
<think>好的,我现在需要帮助用户了解如何在JMeter中将自定义函数与属性进行联动使用。首先,我需要回忆一下JMeter的基本概念,特别是关于自定义函数和属性的部分。 我记得JMeter支持用户自定义函数,这些函数可以通过编写Java代码来实现特定的功能,比如生成特定格式的数据或处理加密签名。而属性(Properties)在JMeter中是全局的,可以在测试计划的不同部分共享,比如通过__P或__property函数来访问。用户可能希望将自定义函数与属性结合使用,以便动态调整函数的行为,比如根据不同的测试环境加载不同的配置。 接下来,我需要考虑如何实现这种联动。首先,用户需要创建一个自定义函数,这通常需要继承AbstractFunction类,并实现相应的方法。然后,在函数中读取JMeter属性,可以通过JMeterUtils.getPropDefault()方法获取属性值。例如,在函数初始化时读取某个属性,并根据该属性的值改变函数的输出。 然后,用户需要将编译好的自定义函数打包成JAR文件,并放入JMeter的lib/ext目录下,这样JMeter在启动时就能加载这个函数。之后,在测试计划中,用户可以通过函数助手或者直接在脚本中调用这个自定义函数,同时通过属性来动态调整参数。 另外,用户可能需要在测试计划的不同线程组或控制器中设置属性,比如使用__setProperty函数来动态修改属性的值,这样自定义函数在下次调用时就能读取到更新后的值,实现联动效果。例如,在一个前置处理器中设置属性,然后在后续的请求中使用自定义函数读取该属性,以生成不同的请求参数。 还需要注意属性的作用范围。JMeter属性是全局的,所以一旦设置,所有线程组和线程都能访问到。这可能涉及到线程安全的问题,但在大多数情况下,JMeter的属性机制是线程安全的,用户只需确保在并发环境下正确管理属性的读写顺序。 此外,用户可能需要参考引用中的内容,比如引用[1]提到JMeter可以设置各种变量,包括外部文件引用和自定义参数,而自定义函数可以结合这些变量使用。引用[4]中提到了使用正则表达式提取器来处理鉴权码,这可能与自定义函数处理属性有类似之处,比如动态获取和更新属性值。 最后,应该考虑用户可能遇到的问题,比如属性未正确加载,或者自定义函数没有正确读取属性。需要建议用户检查JAR文件的放置位置,确认属性名称是否正确,以及是否在测试计划中正确设置了属性值。同时,使用调试取样器和查看结果树来验证函数的输出是否符合预期。 总结一下,步骤大致是:创建自定义函数,读取属性;打包并部署函数;在测试计划中设置和调用属性;验证和调试。同时,提供示例代码和注意事项,帮助用户更好地理解和应用。</think>在JMeter中实现自定义函数与属性的联动使用,可通过以下步骤完成: ### 一、自定义函数开发基础 1. **创建Java类继承AbstractFunction** ```java import org.apache.jmeter.engine.util.CompoundVariable; import org.apache.jmeter.functions.AbstractFunction; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.samplers.Sampler; import java.util.Collection; import java.util.LinkedList; import java.util.List; public class CustomFunction extends AbstractFunction { private static final List<String> DESC = new LinkedList<>(); private static final String KEY = "__customFunc"; private CompoundVariable param1; static { DESC.add("自定义函数示例(参数1为JMeter属性名)"); } @Override public String execute(SampleResult sampleResult, Sampler sampler) { String propName = param1.execute(); // 获取属性名 return JMeterUtils.getPropDefault(propName, "default_value"); // 读取属性值 } @Override public void setParameters(Collection<CompoundVariable> parameters) { param1 = parameters.iterator().next(); // 接收第一个参数作为属性名 } @Override public String getReferenceKey() { return KEY; } @Override public List<String> getArgumentDesc() { return DESC; } } ``` 2. **打包为JAR文件并放入`lib/ext`目录** ### 二、属性联动实现方式 1. **静态属性定义** 在`jmeter.properties`文件中定义基础属性: ``` custom.data.source=API ``` 2. **动态属性设置** 在测试计划中使用`__setProperty`函数动态修改属性: ```java ${__setProperty(encrypt.key, ${__Random(1000,9999)},)} ``` 3. **函数调用属性** 在HTTP请求参数中使用自定义函数读取属性: ```java // 调用自定义函数,传入属性名作为参数 ${__customFunc(encrypt.key)} ``` ### 三、典型联动场景示例 **场景:动态加签验签** 1. 前置处理器中生成密钥并存储为属性: ```java vars.put("tempKey", RSAUtils.generateKey()); ${__setProperty(shared.key, ${tempKey},)} ``` 2. 自定义函数读取密钥进行签名: ```java public String execute(...) { String key = JMeterUtils.getPropDefault("shared.key", "default"); return SHA256.sign(key + inputParam); } ``` ### 四、调试与验证方法 1. **添加调试取样器**查看属性传递过程 2. **使用BeanShell断言**验证属性值: ```java String propValue = props.get("custom.property"); log.info("当前属性值:" + propValue); ``` 3. **跨线程组传递**时需通过`__setProperty`+`__P`组合实现全局共享 ### 五、注意事项 1. **属性作用域**:JMeter属性是全局级变量[^1],修改会影响所有线程 2. **性能影响**:频繁读写属性可能降低测试效率,建议配合`__V`函数使用 3. **默认值设置**:始终为`getPropDefault()`设置合理的默认值 4. **版本兼容**:JMeter 5.4+推荐使用JSR223组件代替BeanShell[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值