今天,当我调试JMeter脚本时,发现了一个使我感到困惑的问题。
userId
设置为1001200
${userId}
和vars.get("userId")
时获得不同的“ userId”值。我认为它们应该具有相同的值,但事实并非如此。运行vars.put("userId", "-111")
之后,${userId}
和vars.get("userId")
获得不同的值:所以${}
和vars.get()
似乎有些不同,即使它们的变量相同,有人知道原因吗?
谢谢。
答案 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")
是一个函数调用,它将每次检查变量值。