【问题标题】:Jmeter - How to use the variable set in first request for all the threads in one thread groupJmeter - 如何在一个线程组中的所有线程的第一个请求中使用变量集
【发布时间】:2020-07-21 22:15:27
【问题描述】:

我想只运行一次请求,并使用 Json 提取器从其响应中获取授权令牌,然后将该令牌用作在同一线程组下运行的另一个请求中的标头。

我尝试使用“设置线程组”,但变量值对主线程组不可用。 所以,我在同一个线程组下使用了“If Controller”,条件如下:

${__groovy(ctx.getThreadNum() == 0 &&  vars.getIteration() == 1,)}

这使得特定请求只执行一次。 但是,变量值仅适用于后续请求的一个线程,而不适用于所有线程。下面是结果树的图片:

我可以知道如何访问在第一个请求中为所有线程而不是一个线程设置的变量值吗?

【问题讨论】:

    标签: testing jmeter performance-testing load-testing


    【解决方案1】:

    根据JMeter Documentation

    属性与变量不同。 变量是线程本地的;属性对所有线程都是通用的

    因此,如果您想为所有线程(虚拟用户)使用单个令牌,您需要先将其转换为 JMeter 属性,例如:

    1. 在 If 控制器下,使用 __setProperty() function 将变量转换为属性
    2. 在您的 GET 请求中使用 __P() function 读取属性值

    在线程之间共享数据的另一种方式(即使它们位于不同的线程组中)是使用Inter-Thread Communication Plugin

    【讨论】:

    • 如果我使用较少数量的线程,这可以正常工作。如果我想用更多线程运行测试,甚至在第一个请求(生成令牌)之前执行其他请求,并且它们失败,因为它们没有有效的令牌。如果有任何方法可以增加延迟,您能帮忙吗?
    【解决方案2】:

    您不能在其他线程中使用在一个线程中创建的变量,这就是 JMeter 为提取的变量确定作用域的方式。

    您已经接近解决方案,提供步骤以便任何人都可以解决这样的问题:-

    1. 使用If Controller 确保仅发出一次请求以获取授权令牌
    2. 使用后处理器提取令牌
    3. 使用后处理器将令牌保存在属性中,以便在多个线程中使用相同的令牌
    4. 通过引用property函数而不是变量,在后续请求中使用新创建的属性而不是变量

    您可以使用下面的JSR223 post-processor 从变量创建属性:

    请注意,如果您使用线程组模拟多个用户,理想情况下您应该为不同的用户创建不同的身份验证令牌。

    P.S.:Balzemeter 有一篇文章使用 BeanShell 来演示如何解决这个问题

    【讨论】:

    • @4mo1,感谢您的解决方案,我试过了,但没有用。正如你提到的,我尝试直接使用变量名,以及使用 ${token},但在这两种情况下都不起作用。
    • 请确保将其存储为属性而不是变量
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2021-07-24
    相关资源
    最近更新 更多