【问题标题】:How to define different sets of variables for a JMeter Test Plan如何为 JMeter 测试计划定义不同的变量集
【发布时间】:2019-08-10 01:31:34
【问题描述】:

我正在尝试了解如何最好地在 JMeter 中构建一个简单的登录/注销负载测试。我的基本测试结构如下:

- Test Plan
  - Thread Group 1
    - Http Request Defaults
    - Http Cookie Manager
    - CSV Data Set Config
    - Login Controller
      - Login Request (username/password)
      - 2FA Request
        - Request Assertion
    - Logout Controller
      - Logout Request
        - Request Assertion
    - View Results Tree

我的 CSV 中有一个包含 1000 个用户的列表。我想构建这个测试,以便我可以针对集群中的 4 个不同服务器运行同时测试。每个服务器应该处理 10 个线程。

我认为线程组应该定义为 10 个线程。但是,我如何并行启动 4 个组(每个组指向不同的服务器)?我必须复制线程组 4 次吗?这似乎不合逻辑。

此外,我有多个要测试的环境。每个环境都有不同的服务器。我希望定义变量组,但不确定如何执行此操作,然后只需指定我想再次运行的环境。

例如:

 prod : 
   server:
     - 10.1.1.1
     - 10.1.1.2
     - 10.1.1.3
     - 10.1.1.4
   protocol: https
   contextRoot: /

 dev:
   server:
     - 192.168.1.1
     - 192.168.1.2
   protocol: http
   contextRoot: /test/

然后在 TestPlan 中简单地指定环境并确定要生成的正​​确线程组数量(每台服务器 1 个组),并使用定义的正确端点、协议等。但我似乎无法找到如何构建嵌套数据集以及如何从中动态创建线程组。这不可行吗?

【问题讨论】:

    标签: jmeter performance-testing load-testing


    【解决方案1】:

    对于您的问题,您不需要使用 4 个线程组或并行脚本。这可以使用 JSR223 Sampler 中的 Java 代码来实现。

    根据每个服务器上 10 个线程的线程要求,使用类似这样的东西。我正在处理基于${__threadNum} 函数。前 10 个线程将转到 IP1,接下来是 IP2,依此类推……使用这种逻辑,可以为集群和主机实现任何复杂的场景。请原谅我的Java代码[我的Java不太好],我知道可以编写更高效的代码,我会学习的。

    String currentThread = ${__threadNum};
    String IP1 = "10.0.0.1";
    String IP2 = "10.0.0.2";
    String IP3 = "10.0.0.3";
    String IP4 = "10.0.0.4";
    //log.info("Parameter ThreadNumber: " + currentThread);
    int tNum = Integer.parseInt(currentThread);
    
           if (tNum <= 10)
            {
                vars.put("host",IP1);
            }
            else if(tNum > 10 && tNum <= 20)
            {
                vars.put("host",IP2);
            }
            else if (tNum > 20 && tNum <= 30)
            {
                vars.put("host",IP3);
            }
            else if (tNum > 30 && tNum <= 40)
            {
                vars.put("host",IP4);
            }
            else
            {
                vars.put("host",IP1);
            }
    
    log.info("Parameter ThreadNumber: " + currentThread);
    log.info("Parameter Host: " + vars.get("host"));
    

    现在,在 HTTP 采样器中,使用:

    ${host} in Server Name or IP field. If Port and Protocol needs to be changed, change that in Java code
    

    来到 CSV 文件,我假设它包含用于登录的用户名和密码。可以根据您的要求进行各种设置。我会建议即时生成该用户名和密码。

    注意:线程组设置需要根据您的要求进行。 40 线程数,Rampup = 1 和循环计数。

    【讨论】:

      【解决方案2】:

      我相信您正在寻找Module ControllerTest Fragments,因为这是避免代码重复和违反DRY principle 的方法

      因此,您可以将通用逻辑移动到测试片段中,并根据您的测试场景从多个位置 providing different parameters 引用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多