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

JMeter,使用动态递增值的线程,jmeter,Jmeter,我创建了一个JMeter功能测试,基本上: 创建一个用户 与用户一起登录 删除用户 现在,我需要能够处理这个问题,并动态生成一个带有默认前缀和数字递增后缀的用户名(即TestUser_1、TestUser_2等) 我用了计数器,一切都很顺利,直到我真的打通了线程/循环的数量。当我这么做的时候,我和柜台发生了冲突。一些线程试图读取计数器,但计数器已被另一个线程递增。这导致尝试删除刚创建的线程,然后尝试使用刚删除的线程登录 项目设置如下: Test Plan Thread group

我创建了一个JMeter功能测试,基本上:

  • 创建一个用户
  • 与用户一起登录
  • 删除用户
  • 现在,我需要能够处理这个问题,并动态生成一个带有默认前缀和数字递增后缀的用户名(即TestUser_1、TestUser_2等)

    我用了计数器,一切都很顺利,直到我真的打通了线程/循环的数量。当我这么做的时候,我和柜台发生了冲突。一些线程试图读取计数器,但计数器已被另一个线程递增。这导致尝试删除刚创建的线程,然后尝试使用刚删除的线程登录

    项目设置如下:

    Test Plan Thread group Counter User Defined Variables Samplers 测试计划 螺纹组 柜台 用户定义变量 采样器 我希望通过在线程执行时使用计数器向用户定义的变量追加一个数字来解决这个问题,但是在用户定义的变量中无法访问计数器

    有没有办法解决这个问题


    提前感谢。

    我已经成功地将以下方案用于任意数量的测试用户:

    一,。使用beanshell脚本(例如)生成包含测试用户详细信息的csv文件,例如:

    testUserName001,testPwd001
    testUserName002,testPwd002
    . . .
    testUserName00N,testPwd00N
    
    测试运行所需的条目数量。
    这是在单独的线程组中,或者甚至在单独的jmx脚本中,每“N个用户测试运行”完成一次。。。没什么区别

    您可以在下面找到有效的beanshell代码


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

    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 . . . 螺纹组 线程数=1 循环计数=1 . . . While控制器 条件=${uuu javaScript(${newUserName}”!=“”,)}//此操作将重复,直到EOF CSV数据集配置 Filename=${{uuuu属性(user.dir)}${{uuuu BeanShell(File.separator,)}${{uuuu P(users list,)}//生成的用户列表的路径 Variable Names=newUserName,newUserPwd//这些是从文件读入指向变量的测试用户详细信息 分隔符 在EOF上回收?=假的 EOF上的停止线程?=真的 共享模式=当前线程组 [在此处创建测试用户逻辑]//以下是在应用程序中创建单独用户的操作 . . .

    三,。执行多用户逻辑。 与上面给出的模式类似,但线程组不是为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 . . . 螺纹组 线程数=${uu P(userscont,)}//设置需要测试的用户数 上升周期=${P(上升周期,)} 循环计数=X . . . While控制器 条件=${uuu javaScript(${newUserName}”!=“”,)}//此操作将重复,直到EOF CSV数据集配置 Filename=${{uuuu属性(user.dir)}${{uuuu BeanShell(File.separator,)}${{uuuu P(users list,)}//生成的用户列表的路径 Variable Names=newUserName,newUserPwd//这些是从文件读入指向变量的测试用户详细信息 分隔符 在EOF上回收?=假的 EOF上的停止线程?=真的 共享模式=当前线程组 [此处的测试逻辑]//以下是测试操作 . . .

    关键思想在于使用线程组+While Controller+CSV数据集配置组合:

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


    您可以在此处获取所述架构的模板脚本:


    生成测试用户详细信息的Beanshell脚本如下所示,并采用以下参数:
    -测试用户数
    -测试用户名模板(在您的情况下为“TestUser_u2;”)
    -测试用户名格式(例如,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());
    }
    
    import java.text.*;
    导入java.io.*;
    导入java.util.*;
    字符串[]params=Parameters.split(“,”);
    int count=Integer.valueOf(参数[0]);
    字符串testName=params[1];
    字符串nameFormat=params[2];
    字符串usersList=params[3];
    StringBuilder内容=新建StringBuilder();
    试一试{
    DecimalFormat formatter=新的DecimalFormat(nameFormat);
    FileOutputStream fos=新的FileOutputStream(System.getProperty(“user.dir”)+File.separator+usersList);
    
    对于(int i=1;i我已成功地将以下方案用于任意数量的测试用户:

    1.使用beanshell脚本(例如)生成包含测试用户详细信息的csv文件,例如:

    testUserName001,testPwd001
    testUserName002,testPwd002
    . . .
    testUserName00N,testPwd00N
    
    测试运行所需的条目数量。
    这在单独的线程组中,或者甚至在单独的jmx脚本中,每“N个用户测试运行”执行一次,没有任何区别

    您可以在下面找到有效的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 . . . 螺纹组 线程数=1 循环计数=1 . . . While控制器 条件=${uuu javaScript(${newUserName}”!=“”,)}//t