JMeter-使用$ {}或vars.get()获得变量值之间的区别是什么

时间:2018-07-17 15:16:28

标签: jmeter

今天,当我调试JMeter脚本时,发现了一个使我感到困惑的问题。

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

enter image description here

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

enter image description here

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

谢谢。

2 个答案:

答案 0 :(得分:3)

是的,编写脚本时需要遵循best practices,并避免使用${value}

  

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

答案 1 :(得分:2)

@ 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") + "***");

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