【问题标题】:JMeter prevent any user from running at the same time on different threadsJMeter 防止任何用户同时在不同线程上运行
【发布时间】:2020-04-06 04:42:11
【问题描述】:

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

我需要在 JMeter 上做以下事情:

(场景 1)

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

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

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

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

像这样:

(场景 2)

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

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

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

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

【问题讨论】:

    标签: multithreading loops jmeter load-testing


    【解决方案1】:

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

    1. 在其中创建 setUp Thread Group(1 个线程,1 个循环),其中包含 groovy 脚本(JSR223 Sampler)。将 CSV 文件读取到行/对象,将每个放入 numbered 属性(行的索引将被视为线程号)
    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】:

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

      1. 您以某种方式违反了JMeter Scoping Rules,即您的CSV Data Set Config 的位置不正确
      2. 如果您希望每个线程(虚拟用户)每次迭代都读取下一行,则您使用了不正确的 CSV 数据集配置 Sharing Mode - 您应该坚持使用 All threads

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

      以防万一你想复制行为:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        相关资源
        最近更新 更多