如何在Groovy及Java中调用JMeter内置函数?
嘿,我完全懂你不想重复造轮子的心情——直接复用JMeter内置函数确实比自己重新实现要省心多了!下面分别给你Groovy脚本和Java Sampler两种场景下的解决方案:
在Groovy脚本中调用JMeter内置函数
你之前尝试的ctx、vars、props主要是用来访问JMeter上下文、用户变量和系统属性的,内置函数需要通过专门的方式调用。这里有两种简单的方法:
方法1:直接实例化对应函数类
每个JMeter内置函数都有对应的Java实现类,比如__machineName()对应的是org.apache.jmeter.functions.MachineName。你可以直接实例化这个类并调用它的execute方法:
import org.apache.jmeter.functions.MachineName import org.apache.jmeter.samplers.SampleResult import org.apache.jmeter.samplers.Sampler // 实例化机器名函数 def machineNameFunc = new MachineName() // __machineName不需要参数,所以传空列表 def machineName = machineNameFunc.execute([], null as SampleResult, null as Sampler) // 输出结果到日志或者使用变量存储 log.info("当前机器名:${machineName}") vars.put("machineName", machineName)
方法2:用CompoundVariable解析函数表达式
这种方法更通用,不管是哪个内置函数,都可以通过解析函数字符串来执行,适合你需要调用多种函数的场景:
import org.apache.jmeter.engine.util.CompoundVariable // 传入你要调用的函数表达式 def funcExpr = new CompoundVariable("${__machineName()}") // 执行函数并获取结果 def machineName = funcExpr.execute() log.info("当前机器名:${machineName}") vars.put("machineName", machineName)
在Java Sampler中调用JMeter内置函数
Java Sampler里的思路和Groovy类似,同样可以通过实例化函数类或者使用CompoundVariable来实现:
实例化函数类的方式
import org.apache.jmeter.functions.MachineName; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import java.util.ArrayList; public class MachineNameSampler extends AbstractJavaSamplerClient { @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult result = new SampleResult(); result.sampleStart(); try { // 实例化机器名函数 MachineName machineNameFunc = new MachineName(); // 传入空参数列表(__machineName无参数) String machineName = machineNameFunc.execute(new ArrayList<>(), result, null); // 设置响应结果 result.setResponseData("获取到的机器名:" + machineName, "UTF-8"); result.setSuccessful(true); } catch (Exception e) { result.setSuccessful(false); result.setResponseMessage("获取机器名失败:" + e.getMessage()); } result.sampleEnd(); return result; } }
通用的CompoundVariable方式
如果需要调用多个不同的内置函数,这种方式更灵活:
import org.apache.jmeter.engine.util.CompoundVariable; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; public class GenericFunctionSampler extends AbstractJavaSamplerClient { @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult result = new SampleResult(); result.sampleStart(); try { // 解析__machineName函数表达式 CompoundVariable funcExpr = new CompoundVariable("${__machineName()}"); String machineName = funcExpr.execute(); result.setResponseData("机器名:" + machineName, "UTF-8"); result.setSuccessful(true); } catch (Exception e) { result.setSuccessful(false); result.setResponseMessage(e.getMessage()); } result.sampleEnd(); return result; } }
这样你就不用自己重新实现InetAddress.getLocalHost().getHostName()这类逻辑,直接复用JMeter内置函数的实现就好啦!
内容的提问来源于stack exchange,提问作者JulianHarty
相关产品推荐
相关产品推荐

