【问题标题】:Jmeter random variable in several threads几个线程中的Jmeter随机变量
【发布时间】:2013-05-17 15:38:44
【问题描述】:

我有一个 Jmeter 线程组,它在整个过程中多次使用变量 uuid

uuid 定义为 12345678-1234-4444-a123-${__Random(111111111111,999999999999)}

换句话说,它以固定系列12345678-1234-4444-a123- 开头,然后随机化最后十二个字符。

我想同时运行多个线程,这会产生以下问题。

当我将uuid 定义为线程组内的用户定义变量时,它会随机化一次,然后将该值用于我的所有线程。 如果我将其设置为全局,则会发生同样的事情。

完成后我将同时运行数千个线程,因此我无法进行手动解决方案或读/写磁盘。

有没有人有这方面的经验? 我已经通过文档和谷歌很长时间了,但似乎找不到解决方案。

简而言之:我需要随机化一个变量,在整个线程组中使用该变量,并在多个同时线程中运行该线程组。该变量在每个不同的线程中应该有不同的随机值。

【问题讨论】:

    标签: random jmeter


    【解决方案1】:

    假设您可以简单地使用Random Variable 配置元素:

    Variable Name:     uuid
    Output Format:     12345678-1234-4444-a123-000000000000
    Minimum Value:     111111111111
    Maximum Value:     999999999999
    Per Thread (User): True
    

    产生的价值

    • 可以通过${uuid}访问;
    • 每个线程都是唯一的;
    • 在每个线程的不同采样器调用流之间保留(在每次引用期间不会重新生成);
    • 在线程组的每次迭代期间生成。
    Test Plan
        Thread Group
            Random Variable
            ...
            Sampler 1
            Sampler 2
            ...
    

    例如

    
    iteration: 1
        thread: 1
            sampler 1: VALUE_1-1
            sampler 2: VALUE_1-1
            ...
        thread: 2
            sampler 1: VALUE_2-1
            sampler 2: VALUE_2-1
            ...
        ...
    iteration: 2
        thread: 1
            sampler 1: VALUE_1-2
            sampler 2: VALUE_1-2
            ...
        thread: 2
            sampler 1: VALUE_2-2
            sampler 2: VALUE_2-2
            ...
        ...
    

    为上面给出的架构实现的示例脚本:rnd-var.jmx


    根据Random SeedRandom Variable的字段描述:

    默认是以毫秒为单位的当前时间。如果你使用相同的种子 将每个线程设置为 true 的值,您将获得相同的值 根据随机类搜索线程。

    如果 Random 的两个实例使用相同的种子创建,并且 为每个方法调用相同的序列,它们将生成和 返回相同的数字序列。

    在实现高并发场景时请记住这一点(如下面的 cmets 中所述)。 为了克服这个问题,您可以使用随机种子,例如${__Random(MIN,MAX)} 作为 Seed for Random function 字段的值。

    【讨论】:

    • Brilliant @Alies Belik... 但我使用的是循环控制器而不是不同的采样器。流程是: 1. 线程组 1.1 循环计数器 1.1.1 SOAP 请求 我在哪里放置随机变量?
    • 您还可以使用随机变量从每个线程(用户)的预定义列表中选择一个字符串。我用它为每个虚拟用户随机选择一个搜索关键字。我用逗号分隔的关键字列表创建了一个变量,然后在线程组中创建了一个随机变量,最小值为 0,最大值为${__javaScript('${search.keywords}'.split('\,').length-1;)},并将其保存到变量keyword.index。然后在我想使用随机选择的关键字的地方,我使用${__javaScript('${search.keywords}'.split('\,')[${keyword.index}];)}
    • 我一直在使用它,但只是通知一些线程仍然获得相同的值。我认为这是因为线程同时启动,因此随机值在同一毫秒生成,导致线程在毫秒内获得与随机基数相同的值。有什么建议吗?
    • 嗨@TuukkaMustonen。谢谢你的注意。请查看上面的答案更新。简而言之:看起来像随机化种子(通过例如${__Random(MIN,MAX)} 函数)会产生更好的结果。
    • @AliaksandrBelik 有趣的是,这对我没有任何影响。但是,如果我将 Per Thread(User) 设置为 False,我会突然为每个线程获得唯一的 UUID。所以,它以完全相反的方式工作......我的Random VariableThread Group 内,不确定这是否会影响它。
    【解决方案2】:

    随便放

    12345678-1234-4444-a123-${__Random(111111111111,999999999999)}
    

    在需要的地方内嵌。

    如果你把它放在你的 UDV 组件中,值只分配一次,甚至在线程启动之前。 根据 jmeter 文档,该行为是可以的。请仔细阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多