我创建了一个JMeter功能测试,主要是:
现在,我需要能够对此进行线程化,并动态生成一个带有默认前缀和数字增量后缀的用户名(即TestUser_1,TestUser_2,...等)。
我使用了计数器,一切正常,直到我真正打了一些线程/循环。当我这样做时,我与柜台发生了冲突。有些线程试图读取计数器,但计数器已经被另一个线程增加了。这导致尝试删除刚刚创建的线程,然后尝试使用刚刚删除的线程登录。
项目设置如下:
Test Plan Thread group Counter User Defined Variables Samplers
我希望通过使用计数器在线程执行时向用户定义的变量附加一个数字来解决这个问题,但是在用户定义的变量中无法访问计数器。
关于如何解决这个问题的任何想法?
提前谢谢。
答案 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());
}
一起看起来像是:
很抱歉,如果答案太过分了。
希望这会有所帮助。
答案 1 :(得分:1)