首页 > 解决方案 > JMeter 防止任何用户同时在不同线程上运行

问题描述

我正在使用一个包含 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,...

线程 NUserN:Task1->Task2->Task3,UserN:Task1->Task2->Task3,UserN:Task1->Task2->Task3,...

但是我一直无法弄清楚如何做到这一点。每次我运行测试时,所有线程似乎都会在遍历 CSV 文件时选择用户,并将用户混合到同时在两个不同线程上找到用户的地步。

像这样:

(情景 2)

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

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

线程 NUserN:Task1->Task2->Task3,...,User1:Task1->Task2->Task3,User2:Task1->Task2->Task3

关于为什么会发生这种情况以及如何实现第一个场景的任何想法?

标签: multithreadingloopsjmeterload-testing

解决方案


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

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

这是上述两个步骤的实现。我使用groovycsv将 CSV 解析为对象(不要忘记将额外的库放入lib/ext. 有下一个文件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}")

希望能帮助到你。


推荐阅读