【问题标题】:When running JMeter script from Java functions and properties do not work从 Java 函数和属性运行 JMeter 脚本时不起作用
【发布时间】:2017-09-26 14:55:30
【问题描述】:

我正在尝试使用

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

【问题讨论】:

  • 应用程序的 jar 中是否包含依赖项?或者你是如何运行它的?
  • 我正在使用 maven 运行它,我发现 JMeter 希望在类路径中有一个库,其确切名称为“ApacheJMeter_functions.jar”,它甚至不能是“ApacheJMeter_functions-3.3.jar”如果文件是二进制相等

标签: java jmeter performance-testing


【解决方案1】:

您的代码错误,您没有引用正确的 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 运行代码失败

失败是由于这段代码:

【讨论】:

    【解决方案2】:

    小解决方法:

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

    【讨论】:

    • 谢谢。没有解决我的问题,但把我推向了正确的方向。因为我在 Windows 上,getPath 返回一个奇怪的格式(与 JMeter 的 ClassFinder 正在寻找的格式不匹配),所以我删除了类路径构建代码并更改了 setProperty 调用,如下所示: JMeterUtils.setProperty("search_paths", System .getProperty("java.class.path"));它可以按我现在的需要工作。谢谢。
    【解决方案3】:

    当在 Java 代码中使用 Jmeter 函数时,Jmeter 会尝试将 java 类路径中的函数相关类与“search_path”中的类进行比较(从 jar 中读取类)。所以 Jmeter 函数只有在两个路径中都存在所需的函数类时才起作用(Jmeter 对每个函数都有单独的类)。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 2013-09-18
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        相关资源
        最近更新 更多