JMeter 阻止任何用户在不同线程上同时 运行

JMeter prevent any user from running at the same time on different threads

我正在使用一个包含 20 个线程的线程组,这些线程将 运行 并发。 每个话题都必须有一个来自 CSV 文件中 20 个用户列表的唯一用户。 所以基本上我需要每个线程加载一个用户并通过测试计划 (Task1 -> Task2 -> Task3) 与同一个用户迭代多次。

我需要在 JMeter 上执行以下操作:

(场景一)

线程 1用户 1:任务 1 -> 任务 2 -> 任务 3,用户 1:任务 1 -> 任务 2 -> 任务 3,用户 1:任务 1 -> 任务 2 -> 任务 3,...

线程 2用户 2:任务 1 -> 任务 2 -> 任务 3,用户 2:任务 1 -> 任务 2 -> 任务 3,用户 2:任务 1 -> 任务 2 -> 任务 3,...

线程 N用户 N:任务 1 -> 任务 2 -> 任务 3,用户 N:任务 1 -> 任务 2 -> 任务 3,UserN:任务 1 -> 任务 2 -> 任务 3,...

但是我还不知道该怎么做。每次我 运行 测试时,所有线程似乎都在循环访问 CSV 文件时选择用户,并将用户混合到同时在两个不同线程上找到用户的程度。

像这样:

(场景二)

线程 1用户 1:任务 1 -> 任务 2 -> 任务 3,...,用户 2:任务 1 -> 任务 2 -> 任务 3,用户 3:任务 1 -> 任务 2 -> 任务 3

线程 2: User2: Task1 -> Task2 -> Task3, ..., User4:任务 1 -> 任务 2 -> 任务 3,用户 3:任务 1 -> 任务 2 -> 任务 3

线程 N: UserN: Task1 -> Task2 -> Task3, ..., User1:任务 1 -> 任务 2 -> 任务 3,用户 2:任务 1 -> 任务 2 -> 任务 3

关于为什么会发生这种情况以及如何实现第一种情况有什么想法吗?

所以你想要的是将每个 CSV 行分配给线程一次?我认为可以通过下一个算法来实现:

  1. 创建 setUp Thread Group(1 个线程,1 个循环),其中包含 groovy 脚本 (JSR223 Sampler)。读取 CSV 文件到 lines/objects,将每个文件放入编号 属性(行索引将被视为线程编号)
  2. 在主线程组中添加另一个 groovy 脚本作为第一个采样器,读取索引 属性 并将其分配给常规变量。

以上两个步骤的实现如下。我使用 groovycsv 将 CSV 解析为对象(不要忘记将额外的库放入 lib/ext),但您可以在步骤 1 中简单地将文件读入行,然后在步骤 2 中按分隔符拆分行。有下一个文件 users.csv:

username,password
user1,password1
user2,password2
user3,password3
user4,password4

脚本:

  1. 第 1 步:
// setUp Thread Group > groovy JSR223 Sampler

import static com.xlson.groovycsv.CsvParser.parseCsv

List users = parseCsv(new File("users.csv").text).findAll() 
// you can even shuffle them
// Collections.shuffle(users)

users.eachWithIndex { user, i -> props.put("USER_${i}", user) }
// now we have properties named 'USER_0', 'USER_1', 'USER_2'... 'USER_N'
  1. 第 2 步:
// main thread group > groovy JSR223 Sampler

// 1st thread will always read 'USER_0' property, 2nd 'USER_1' and so on
def user = props.get("USER_${ctx.threadNum}")

vars.put('USERNAME', user.username)
vars.put('PASSWORD', user.password)
// now all next samplers in thread group can use 'USERNAME' and 'PASSWORD' variables, like ${USERNAME}

//test that once selected user sticks to same thread
log.info("Thread num: ${ctx.threadNum}, user: ${user}")

希望对您有所帮助。

我无法重现您的问题,因此我可以想到 2 个可能的原因:

  1. 你违反了JMeter Scoping Rules somewhere somehow, i.e. location of your CSV Data Set Config不正确
  2. 您使用了不正确的 Sharing Mode CSV 数据集配置,如果您希望每个线程(虚拟用户)每次迭代都读取下一行 - 您应该坚持 All threads

如您所见,每个线程(虚拟用户)正在读取自己的行并将其用于所有 "tasks"

以防万一,如果您想复制该行为: