我正在尝试使用Java代码执行JMeter脚本
String jmeterHome = "D:/tmp/apache-jmeter-3.3";
StandardJMeterEngine jmeter = new StandardJMeterEngine();
JMeterUtils.loadJMeterProperties(jmeterHome + "/jmeter.properties");
JMeterUtils.setJMeterHome(jmeterHome);
JMeterUtils.initLocale();
SaveService.loadProperties();
File script = new File(jmeterHome + "/http_localhost.jmx");
HashTree testPlanTree = SaveService.loadTree(script);
Summariser summer = null;
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (summariserName.length() > 0) {
summer = new Summariser(summariserName);
}
String logFile = jmeterHome + "/file.jtl";
ResultCollector logger = new ResultCollector(summer);
logger.setFilename(logFile);
testPlanTree.add(testPlanTree.getArray()[0], logger);
jmeter.configure(testPlanTree);
jmeter.run();
在“线程组”配置中的JMeter GUI中,我将“线程数”设置为“$ {__ P(xxx,20)}”。它可以在GUI中正常工作 - 我可以使用默认值“20”执行脚本。但上面的代码不会启动任何线程。 Java代码打印出它试图启动零线程。
我见过Jmeter functions don't executing when calling from java code,我的项目中确实有以下依赖项
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_http</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>3.3</version>
</dependency>
您的代码错误,您没有引用正确的jmeter.properties路径。
工作范例:
String jmeterHome = "/data/jmeter/jmeters/apache-jmeter-3.3/";
StandardJMeterEngine jmeter = new StandardJMeterEngine();
JMeterUtils.setJMeterHome(jmeterHome);
JMeterUtils.loadJMeterProperties(jmeterHome + "bin/jmeter.properties");
JMeterUtils.initLocale();
SaveService.loadProperties();
File script = new File("/data/jmeter/workspace/JMeterFromJava/scenario/localhost.jmx");
HashTree testPlanTree = SaveService.loadTree(script);
Summariser summer = null;
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (summariserName.length() > 0) {
summer = new Summariser(summariserName);
}
String logFile = "/data/jmeter/workspace/JMeterFromJava/results/file.jtl";
ResultCollector logger = new ResultCollector(summer);
logger.setFilename(logFile);
testPlanTree.add(testPlanTree.getArray()[0], logger);
jmeter.configure(testPlanTree);
jmeter.run();
编辑2017年9月29日:
您向bugzilla提交了一个显示问题的演示项目。它有助于了解您的问题。
状态: - 如果App作为主应用程序运行,则代码有效 - 如果AppTest是从Eclipse运行的,则代码有效 - 但是当通过mvn clean install运行时代码失败
失败是由于这段代码:
小解决方法:
final List<String> classPathUrls = new ArrayList<>();
for (final URL url : URLClassLoader.class.cast(this.getClass().getClassLoader()).getURLs()) {
classPathUrls.add(url.getPath());
}
final String classPath = StringUtils.join(classPathUrls, ";");
JMeterUtils.setProperty("search_paths", classPath);
当在Java函数中使用Jmeter函数时,Jmeter会尝试将java类路径中与函数相关的类与来自'search_path'的类(从jar中读取类)进行比较。因此Jmeter函数仅在路径中存在所需的函数类时才起作用(Jmeter具有每个函数的单独类)。
这就是为什么我们需要确保在pom中添加'ApacheJMeter_functions'jar(将在类路径中添加),并将jmeter函数jar的路径设置为'search_path'。两者应该具有相同的版本。
您可以参考this link了解更多详情
JMeter的问题是它希望在类路径中有一个库,其名称为“ApacheJMeter_functions.jar”,即使文件是二进制相等的,它也不能是“ApacheJMeter_functions-3.3.jar”