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

时间:2017-09-26 14:55:30

标签: 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.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>

4 个答案:

答案 0 :(得分:0)

您的代码错误,您没有引用正确的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作为主应用程序运行,则代码有效 - 如果从Eclipse运行AppTest,代码可以正常工作 - 但是当通过mvn clean install

运行时代码失败了

失败是由于这段代码:

答案 1 :(得分:0)

小解决方法:

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

答案 2 :(得分:0)

在Java代码中使用Jmeter函数时,Jmeter尝试将Java类路径中与函数相关的类与'search_path'中的类进行比较(从jars中读取类)。因此,只有在两个路径中都存在所需的函数类时,Jmeter函数才起作用( Jmeter的每个函数都有单独的类)。

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

您可以参考this link了解更多详情

答案 3 :(得分:-1)

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