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

问题描述 投票:1回答:4

我正在尝试使用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>
java jmeter performance-testing
4个回答
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作为主应用程序运行,则代码有效 - 如果AppTest是从Eclipse运行的,则代码有效 - 但是当通过mvn clean install运行时代码失败

失败是由于这段代码:


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

0
投票

当在Java函数中使用Jmeter函数时,Jmeter会尝试将java类路径中与函数相关的类与来自'search_path'的类(从jar中读取类)进行比较。因此Jmeter函数仅在路径中存在所需的函数类时才起作用(Jmeter具有每个函数的单独类)。

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

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.