Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading JMeter阻止任何用户同时在不同线程上运行_Multithreading_Loops_Jmeter_Load Testing - Fatal编程技术网

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

Multithreading JMeter阻止任何用户同时在不同线程上运行,multithreading,loops,jmeter,load-testing,Multithreading,Loops,Jmeter,Load Testing,我使用的线程组有20个线程,将同时运行。 每个线程必须在CSV文件中的20个用户列表中有一个唯一的用户。 因此,基本上我需要每个线程加载一个用户,并使用同一个用户多次迭代测试计划(Task1->Task2->Task3) 我需要在JMeter上执行以下操作: (场景1) 线程1:User1:Task1->Task2->Task3,User1:Task1->Task2->Task3,User1:Task1->Task2->Task3 线程2:User2:Task1->Task2->Task3,Us

我使用的线程组有20个线程,将同时运行。 每个线程必须在CSV文件中的20个用户列表中有一个唯一的用户。 因此,基本上我需要每个线程加载一个用户,并使用同一个用户多次迭代测试计划(Task1->Task2->Task3)

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

(场景1)

线程1:User1:Task1->Task2->Task3,User1:Task1->Task2->Task3,User1:Task1->Task2->Task3

线程2:User2:Task1->Task2->Task3,User2:Task1->Task2->Task3,User2:Task1->Task2->Task3

线程N:UserN:Task1->Task2->Task3,UserN:Task1->Task2->Task3,UserN:Task1->Task2->Task3

然而,我还没有弄明白如何做到这一点。每次我运行测试时,所有线程似乎都会在遍历CSV文件时选择用户,并将用户混合到同时在两个不同线程上发现一个用户的位置

像这样:

(场景2)

线程1:User1:Task1->Task2->Task3,User2:Task1->Task2->Task3,User3:Task1->Task2->Task3

线程2:User2:Task1->Task2->Task3,User4:Task1->Task2->Task3,User3:Task1->Task2->Task3

线程N:UserN:Task1->Task2->Task3,User1:Task1->Task2->Task3,User2:Task1->Task2->Task3


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

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

  • 使用groovy脚本(
    JSR223 Sampler
    )创建
    setUp Thread Group
    (1个线程,1个循环)。将CSV文件读取到行/对象,将每个行/对象放入编号属性(行的索引将被视为线程编号)
  • 在主线程组中,添加另一个groovy脚本作为第一个采样器,读取索引属性并将其分配到正则变量中
  • 下面是上述两个步骤的实现。我曾经将CSV解析为对象(别忘了将额外的lib放入
    lib/ext
    ),但您只需在步骤1中将文件读入行,然后在步骤2中按分隔符拆分行即可。拥有下一个文件
    users.csv

    username,password
    user1,password1
    user2,password2
    user3,password3
    user4,password4
    
    脚本:

  • 步骤1:
  • 步骤2:

  • 希望有帮助。

    我无法复制您的问题,因此我可以想出两个可能的原因:

  • 你不知何故侵犯了某个地方,即你的位置不正确
  • 如果您希望每个线程(虚拟用户)在每次迭代中读取下一行,则使用不正确的CSV数据集配置-您应该坚持使用
    所有线程

  • 正如您所见,每个线程(虚拟用户)都在读取自己的行,并将其用于所有“任务”

    以防万一,如果你想复制这种行为:

    • 设置:

    • CSV文件内容

      line1
      line2
      line3
      
    // 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}")
    
    line1
    line2
    line3