JMeter,使用动态递增值的线程

时间:2011-12-15 22:54:12

标签: jmeter

我创建了一个JMeter功能测试,主要是:

  1. 创建用户;
  2. 以用户身份登录;
  3. 删除用户。
  4. 现在,我需要能够对此进行线程化,并动态生成一个带有默认前缀和数字增量后缀的用户名(即TestUser_1,TestUser_2,...等)。

    我使用了计数器,一切正常,直到我真正打了一些线程/循环。当我这样做时,我与柜台发生了冲突。有些线程试图读取计数器,但计数器已经被另一个线程增加了。这导致尝试删除刚刚创建的线程,然后尝试使用刚刚删除的线程登录。

    项目设置如下:

    Test Plan
        Thread group
            Counter
            User Defined Variables
            Samplers
    

    我希望通过使用计数器在线程执行时向用户定义的变量附加一个数字来解决这个问题,但是在用户定义的变量中无法访问计数器。

    关于如何解决这个问题的任何想法?

    提前谢谢。

2 个答案:

答案 0 :(得分:4)

对于任何数量的测试用户,我都成功使用了以下方案:

1。使用带有测试用户详细信息的beanshell-script(在BeanShell Sampler例如)csv-file中生成,例如:

testUserName001,testPwd001
testUserName002,testPwd002
. . .
testUserName00N,testPwd00N

包含测试运行所需的条目数量 每个“N个用户测试运行”,在单独的线程组中,setUp Thread Group或者甚至可以在单独的jmx脚本中执行此操作...没有任何区别。

您可以在下面找到工作的beanshell代码。


2. 使用以前创建的用户列表在测试应用程序中创建测试用户 如果您不需要在应用程序中创建,则可以跳过此步骤。

    Thread Group
    Number of Threads = 1   
    Loop Count = 1
        . . .
        While Controller
        Condition = ${__javaScript("${newUserName}"!="",)}  // this will repeat until EOF
            CSV Data Set Config
            Filename = ${__property(user.dir)}${__BeanShell(File.separator,)}${__P(users-list,)}    // path to generated users-list
            Variable Names = newUserName,newUserPwd    // these are test-users details read from file into pointed variables
            Delimiter = '
            Recycle on EOF? = False
            Stop thread on EOF? = True
            Sharing Mode = Current thread group

            [CREATE TEST USERS LOGIC HERE]  // here are actions to create separate user in application
                . . .


3。执行多用户逻辑。 模式类似于上面给出的模式,但是线程组不是针对1而是针对N个线程执行。

    Thread Group
    Number of Threads = ${__P(usersCount,)}    // set number of users you need to test
    Ramp-Up Period = ${__P(rampUpPeriod,)}  
    Loop Count = X
        . . .
        While Controller
        Condition = ${__javaScript("${newUserName}"!="",)}  // this will repeat until EOF
            CSV Data Set Config
            Filename = ${__property(user.dir)}${__BeanShell(File.separator,)}${__P(users-list,)}    // path to generated users-list
            Variable Names = newUserName,newUserPwd    // these are test-users details read from file into pointed variables
            Delimiter = '
            Recycle on EOF? = False
            Stop thread on EOF? = True
            Sharing Mode = Current thread group

            [TEST LOGIC HERE]  // here are test actions
                . . .


关键思想是使用线程组+控制器+ CSV数据集配置组合:

3.1。 CSV数据集配置从生成的文件中读取每个测试用户的详细信息:
。 。 。一个。只有一次 - 因为“在EOF上停止线程?=真”;
。 。 。湾不阻止文件进一步访问(在另一个线程组中,例如,如果有的话) - 因为“共享模式=当前线程组”;
。 。 。 C。指向变量 - “变量名称= newUserName,newUserPwd” - 您将在进一步的测试操作中使用;
3.2。 Controller强制CSV数据集配置从生成的文件中读取所有条目 - 由于定义的条件(直到EOF) 3.3。线程组将启动具有已定义的斜坡上升的所有线程 - 或者如果斜坡上升= 0,则同时启动。


您可以在此处使用描述架构的模板脚本:multiuser.jmx


用于生成测试用户详细信息的Beanshell脚本如下所示,并采用以下参数:
  - 测试用户数量   - 测试用户名模板(在您的情况下为“TestUser_”)
  - 测试用户名称格式(例如0 - 获取TestUser_1,00 - 获取TestUser_01,000-用于TestUser_001等等...您可以简单地对此进行硬编码)   - 生成文件的名称。

import java.text.*;
import java.io.*;
import java.util.*;

String [] params = Parameters.split(",");

int count = Integer.valueOf(params[0]);
String testName = params[1];
String nameFormat = params[2];
String usersList = params[3];

StringBuilder contents = new StringBuilder();

try {
    DecimalFormat formatter = new DecimalFormat(nameFormat);
    FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir") + File.separator + usersList);

    for (int i = 1; i <= count; i++) {
        String s = formatter.format(i);
        String testUser = testName + s;
        contents.append(testUser).append(",").append(testUser);

        if (i < count) {
            contents.append("\n");
        }
    }

    byte [] buffer = contents.toString().getBytes();    

    fos.write(buffer);
    fos.close();
}
catch (Exception ex) {
    IsSuccess = false;
    log.error(ex.getMessage());
    System.err.println(ex.getMessage());
}
catch (Throwable thex) {
    System.err.println(thex.getMessage());
}


一起看起来像是:

enter image description here

很抱歉,如果答案太过分了。
希望这会有所帮助。

答案 1 :(得分:1)

“用户定义的变量”配置元素不会从“计数器”配置元素中获取引用变量。我认为这是JMeter中的一个错误。我已在3.2版中验证了此行为。 我添加了一个“BeanShell Sampler”元素来解决这个问题。

请注意,“Counter”元素的引用名称为INDEX Counter

RUN_FOLDER变量设置为“BeanShell Sampler”中TESTS_FOLDER变量和INDEX变量的组合 BeanShell

“Debug Sampler”只是收集变量的快照,以便我可以在“View Results Tree”监听器元素中看到它们。注意RUN_FOLDER变量如何附加INDEX变量值(本例中为5)。 enter image description here