在Java中使用StandardJMeterEngine运行.jmx时,JMeter函数${__time()}不起作用


通过java运行.jmx时,嵌入在HTTP请求主体中的JMeter函数${__time((}不起作用。当在JMeter GUI中运行测试时,它工作得非常好。有人能提供一些建议吗?我甚至试图将这个函数分配给JMeterGUI中的一个变量,然后在json主体中使用该变量,但它在GUI中也能工作,但在通过Java运行.jmx文件时不能工作,我的API以400错误的请求表示错误的主体。

Jmeter GUI中的HTTP请求Json正文:

{"UniqID" : ${__time()}}

我的Java代码:

JMeterUtils.loadJMeterProperties("../bin/jmeter.properties");
JMeterUtils.setJMeterHome("../jMeter");
JMeterUtils.initLocale();
SaveService.loadProperties();
File jmxFile = new File(".../test.jmx");
HashTree testPlanTree = SaveService.loadTree(jmxFile);
StandardJMeterEngine jMeterEngine = new StandardJMeterEngine();
jMeterEngine.configure(testPlanTree);
jMeterEngine.
jMeterEngine.run();
jMeterEngine.exit();

更新:

我从gradle本地文件夹中复制了ApacheJMeter_functions.jar。。\Users\.gradle\caches\modules-2\files-2.1\org.apache.jmeter\ApachJMeter_functions\to/jMeter/lib/ext,这是我上面代码中设置的jMeter主路径中的一个子目录,它起作用了。

但现在的问题是,我如何只通过gradle依赖性而不是通过将实际的jar添加到jMeter主页来实现这一点,因为我无法将jar文件上传到git。

我在jmeter.properties文件中发现了一个路径变量search_path,需要将其设置为jmeter_function jar的路径,但随后又出现了一个新问题,即如何获得gradle依赖项下载的路径,因为java.class.path只给了我一个瘦jar路径。因此,在花了很多天的时间寻找解决方案后,终于能够创建以下解决方案:

task myTest(type: JavaExec) {
...someCode...
doFirst {
args = [sourceSets.test.runtimeClasspath.filter {File f ->
f.name.matches("(.*)ApacheJMeter_functions(.*)")}.asPath]
}
}

然后我在java代码中使用了上面的参数值,将seach_path设置为以下

JMeterUtils.loadJMeterProperties("../bin/jmeter.properties");
JMeterUtils.setJMeterHome("../jMeter");
String jMeterClassPath = args[0];
JMeterUtils.setProperty("search_paths",jMeterClassPath);
JMeterUtils.initLocale();
SaveService.loadProperties();
File jmxFile = new File(".../test.jmx");
HashTree testPlanTree = SaveService.loadTree(jmxFile);
StandardJMeterEngine jMeterEngine = new StandardJMeterEngine();
jMeterEngine.configure(testPlanTree);
jMeterEngine.
jMeterEngine.run();
jMeterEngine.exit();

最新更新