当前位置: 首页 > 知识库问答 >
问题:

从Java运行Jmeter测试时,它不使用属性

韶硕
2023-03-14

我在JMeter中有一个测试,在GUI中它运行得很好,但是当我使用我的Java代码运行它时(比如从这里:http://blazemeter.com/blog/5-ways-launch-jmeter-test-without-using-jmeter-gui),我无法从属性中检索参数。如果我把它们印在beanshell日志里,我就能看到它们。但是,当我试图在线程组中使用这个参数作为用户数时,它是不起作用的。

更多信息:

  1. 我有一个设置线程,它对csv文件的行进行计数,并向属性中插入一个值,以便在下一个线程中使用该属性设置用户数。(此逻辑在测试期间发生两次)。
  2. 我使用的Maven依赖项是:ApacheJMeter_http V2.11(2.13会与common-pools2和d-haven产生冲突)
  3. 日食(如果重要的话)
  4. 目标是传递给测试运行的唯一参数是测试文件。
  5. 测试中的prop语句如下所示:${__p(paramName)}还尝试了$(__property{paramName})
  6. 我还在文件本身中创建了一个属性,而不是在beanshell中使用JMeterutils.SetProperty(“paramName”,“5”);

添加bean shell片段:

import org.apache.jmeter.util.JMeterUtils;
import java.io.*;

BufferedReader br = new BufferedReader(new FileReader("C:\\res\\movieResultData.csv"));
String line;

int counter = 0;
while ((line = br.readLine()) != null) {
   counter++;
}
br.close();
JMeterUtils.setProperty("statsThreadNum",Integer.toString(counter-1));

我的Java代码:

    @Test
public void ttt() throws Exception {
    // JMeter Engine
    StandardJMeterEngine jmeter = new StandardJMeterEngine();

    // Initialize Properties, logging, locale, etc.
    JMeterUtils.loadJMeterProperties("C:\\apache-jmeter-2.12\\bin\\jmeter.properties");
    JMeterUtils.setJMeterHome("C:\\apache-jmeter-2.12");
    //JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
    JMeterUtils.initLocale();

    // Initialize JMeter SaveService
    SaveService.loadProperties();

    // Load existing .jmx Test Plan
    FileInputStream in = new FileInputStream("C:\\apache-jmeter-2.12\\bin\\statsTests2.jmx");
    HashTree testPlanTree = SaveService.loadTree(in);
    in.close();

    // Run JMeter Test
    jmeter.configure(testPlanTree);
    jmeter.run();
}

共有1个答案

吕俊哲
2023-03-14

正确的语法应该是:

${__P(prop_name)}

如果您通过仅Java的实现运行它,请确保在JVM启动时将属性文件传递给它,或者使用以下代码片段:

  JMeterUtils.loadJMeterProperties("/path/to/your/jmeter/bin/jmeter.properties");

您是否使用Apache Exec从Java启动JMeter作为外部进程?如果是,请确保使用以下选项生成CMD line语句:

-p, --propfile {argument}
            the jmeter property file to use
-G, --globalproperty (argument)[=(value)]
            Define Global properties (sent to servers)

向我们展示用于在Setup中设置属性的Beanshell的一个片段可能会很有用。

编辑:我相信问题可能在于你的Beanshell是如何访问属性的。我从来没有访问过JMeterUtils类来操作JMX中的变量或属性。

分配属性的Beanshell语法:

props.put("test_prop_name","prop_value");

获取属性的Beanshell语法:

props.get("test_prop_name");

为变量赋值属性的Beanshell语法:

vars.put("test_var_name",props.get("test_prop"));

然后可以在采样器中引用该变量,如下所示:

${test_var_name}

或者您应该能够在采样器中直接访问该属性,如下所示:

${__P(test_prop_name)}

此外,如果您希望修复JMeter2.13中的Maven问题,请使用以下POM:

<dependencies>
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_config</artifactId>
        <version>2.13</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>commons-math3</groupId>
                <artifactId>commons-math3</artifactId>
            </exclusion>
            <exclusion>
                <groupId>commons-pool2</groupId>
                <artifactId>commons-pool2</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_java</artifactId>
        <version>2.13</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>commons-math3</groupId>
                <artifactId>commons-math3</artifactId>
            </exclusion>

            <exclusion>
                <groupId>commons-pool2</groupId>
                <artifactId>commons-pool2</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-math3</artifactId>
        <version>3.4.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.3</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
 类似资料:
  • 我创建了一个简单的测试来尝试Junit 5: 这就是我使用的依赖关系: 堆栈跟踪是下一步: 知道哪里出了问题吗?

  • 我正在使用gradle来构建和测试我的应用程序。我使用命令 但是当从eclipse中运行时,测试工作完美,当使用gradle运行时失败。我的测试定义如下,它找不到的属性文件在这两个文件夹中: /home/user/Development/git/myproject/src/main/java/com/mycompany/config/home/user/Development/git/myproj

  • 问题内容: 我最近偶然发现了geb,这似乎是对我们的Web应用程序执行集成测试的好方法。我们的平台都是基于Java的,从阅读中可以得知 “ Geb通过与流行的测试框架(例如… JUnit,TestNG …)集成,为功能性Web测试提供了一流的支持。” 我认为从Java类执行测试很容易(testng测试?)。 我是groovy和geb的新手。 到目前为止,我在pom中包含了geb-testng和gr

  • 我们已经为spark编写了单元测试,在本地模式下有4个线程。 当一个接一个地启动时,例如通过intellij或sbt testOnly,每个测试都运行良好。 当用sbt测试启动时,它们会出现如下错误 我们使用的是一个带有多个子项目的sbt项目,其定义如下:

  • 我在无头模式下运行测试时遇到问题。我在两个不同的地方编写了测试用例(web商店和门户)。同样,我使用Headless,当Headless在web shop中为true时,我的测试工作,但当Headless在门户测试用例中为true时,它们不工作。 组织。openqa。硒。ElementClickInterceptedException:元素单击intercepted:元素在点(480483)处不可

  • 我的目标是使用 4 个 Azure 服务器作为负载生成器和 1 个 Azure 服务器来运行负载测试,以启动测试并收集结果。我运行了分布式测试,并且获得了良好的数据。但是今天当我远程启动测试时,4个负载生成器中的3个失败,所有http事务出错。失败的事务记录以下错误: 非HTTP响应消息:java.lang.ClassNotFoundException:org.apache.commons.log