JMeter-使用 ${} 或 vars.get() 获取变量值有什么区别

程江栋*_*程江栋 7 jmeter

今天在调试JMeter脚本时,发现了一个让我很困惑的问题。

  1. CSV 数据配置元素:在 CSV 中,我将变量设置userId1001200

在此输入图像描述

  1. ${userId}然后运行下面的脚本,并在使用和时获取“userId”的不同值vars.get("userId")。我认为它们应该具有相同的值,但似乎并非如此。运行后vars.put("userId", "-111")${userId}得到vars.get("userId")不同的值:

在此输入图像描述

所以即使它们的变量相同,它似乎${}也有一些差异,有谁知道原因吗?vars.get()

提前致谢。

use*_*900 6

是的,您在编写脚本时需要遵循最佳实践并避免使用${value}

使用 JSR 223 元素时,建议检查缓存已编译脚本(如果可用)属性,以确保在底层语言支持的情况下缓存脚本编译。在这种情况下,请确保脚本不使用任何变量,${varName}因为缓存只会采用 的第一个值${varName}。而是使用: vars.get("varName")


Kir*_* S. 4

@user7294900 提供的答案是指选中“缓存编译脚本”选项时的情况。但即使没有检查,您的脚本也会解析执行${varName} 定义的变量,而在执行期间vars.get("varName")解析。

在 JMeter 即将运行任何元素(采样器、预处理器或后处理器)之前,它将获取(每个)文本字段,并解析任何变量、函数或内联代码,通过${...}评估时可用的值来标识。因此,语法${...}将变量转换为常量字符串,您的代码(对于 Groovy 或任何其他执行引擎)将如下所示:

    log.info("***" + "1001200" + "***");
    log.info("***" + vars.get("userId") + "***");
    vars.put("userId", "-111");
    log.info("***" + "1001200" + "***");
    log.info("***" + vars.get("userId") + "***");
Run Code Online (Sandbox Code Playgroud)

因此,无论您在执行过程中如何更改变量,它都不会改变,因为它不再是变量。但vars.get("userId")另一方面,它是一个函数调用,每次都会检查变量值。