JMeter嵌套变量问题:如何正确引用循环计数器i?
解决JMeter tearDown循环中动态获取属性的问题
问题核心在于:${__P(ah_i,)}是JMeter内置函数,它会在脚本运行前完成解析替换,而循环里的变量i是脚本运行时才生成的动态值,函数解析阶段根本识别不到i的实际数值,所以只会固定去找名为ah_i的属性,自然拿不到正确结果。
直接用Groovy原生方式调用JMeter属性API就能解决,修改后的循环代码如下:
// Loop log.info("Loop is starting!"); for (int i = 1; i <= 2; i++) { // 用Props对象动态拼接属性名,第二个参数是属性不存在时返回的默认值(可选) def propValue = Props.get("ah_" + i, "属性不存在"); log.info("Property of thread '" + i + "' in tearDown is: " + propValue); } log.info("Loop is ending!");
额外优化建议
你脚本里其他地方的写法也可以改成更可靠的Groovy原生方式,避免函数解析的潜在问题:
- 替换
${__threadNum}为ctx.getThreadNum()(ctx是JMeter上下文对象,可直接获取当前线程号) - 替换
${__P(ah_${__threadNum},)}为Props.get("ah_" + ctx.getThreadNum())
修改后的完整示例:
def threadNum = ctx.getThreadNum(); def threadPropValue = Props.get("ah_" + threadNum); log.info("Property of thread '" + threadNum + "' in tearDown is: " + threadPropValue); log.info("Property of thread '2' in tearDown is: " + Props.get("ah_2")); vars.put("assertionResults", threadPropValue); log.info("assertionResults = " + vars.get("assertionResults")); // Loop log.info("Loop is starting!"); for (int i = 1; i <= 2; i++) { def propValue = Props.get("ah_" + i, "属性不存在"); log.info("Property of thread '" + i + "' in tearDown is: " + propValue); } log.info("Loop is ending!");
内容的提问来源于stack exchange,提问作者valentinvas
相关产品推荐
相关产品推荐

