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