从Java运行JMeter脚本时,函数和属性不起作用

从Java运行JMeter脚本时,函数和属性不起作用,java,jmeter,performance-testing,Java,Jmeter,Performance Testing,我正在尝试使用Java代码执行JMeter脚本 String jmeterHome = "D:/tmp/apache-jmeter-3.3"; StandardJMeterEngine jmeter = new StandardJMeterEngine(); JMeterUtils.loadJMeterProperties(jmeterHome + "/jmeter.properties"); JMeterUtils.setJMeterHome(jmeterHome); JMeterUtils.

我正在尝试使用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();
在JMeterGUI中的“线程组”配置中,我将“线程数”设置为“${uu p(xxx,20)}”。它在GUI中运行良好-我可以执行默认值为“20”的脚本。但是上面的代码不会启动任何线程。Java代码显示它正在尝试启动零线程

在我的项目中,我已经看到并且确实有以下依赖项

        <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>

org.apache.jmeter
爪哇公寓
3.3
org.apache.jmeter
ApacheJMeter_http
3.3
org.apache.jmeter
ApacheJMeter_函数
3.3

JMeter的问题是,它希望在类路径中有一个名为“ApacheJMeter_functions.jar”的库,它不能是“ApacheJMeter_functions-3.3.jar”,即使文件是二进制相等的

您的代码是错误的,您没有引用正确的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提交了一个演示项目来显示问题。这有助于理解你的问题

地位: -如果应用程序作为主应用程序运行,则代码有效 -如果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);
final List classpathURL=new ArrayList();
对于(最终URL URL:URLClassLoader.class.cast(this.getClass().getClassLoader()).getURL()){
添加(url.getPath());
}
最后一个字符串classPath=StringUtils.join(classPathUrls,“;”);
setProperty(“搜索路径”,类路径);

当Java代码中使用Jmeter函数时,Jmeter会尝试将Java类路径中与函数相关的类与“搜索路径”(从JAR读取类)中的类进行比较。因此,只有当两个路径中都存在必需的函数类时,Jmeter函数才能工作(Jmeter为每个函数都有单独的类)

这就是为什么我们需要确保在pom中添加的'ApacheJMeter_functions'jar(将添加到类路径中)和jmeter functions jar的路径设置为'search_path'。两者应该具有相同的版本


有关更多详细信息,请参阅

应用程序的jar中是否包含依赖项?或者您是如何运行它的?我使用maven运行它,我发现JMeter希望在类路径中有一个库,确切名称为“ApacheJMeter_functions.jar”,它不可能是“ApacheJMeter_functions-3.3.jar”,即使文件是二进制相等的。没有解决我的问题,但把我推向了正确的方向。因为我在windows上,getPath返回一种奇怪的格式(与JMeter的ClassFinder所寻找的格式不匹配),所以我删除了类路径构建代码并更改了setProperty调用,如下所示:JMeterUtils.setProperty(“search_path”,System.getProperty(“java.class.path”);我现在就需要它。谢谢