For循环在Beanshell脚本Jmeter中未按预期工作

rxztt3cl  于 2023-06-23  发布在  Shell
关注(0)|答案(2)|浏览(160)

下面是我的代码,我试图通过一组状态循环,如果状态等于N,则中断。并将EpisodeId保存在同一索引处。(在beanshell后处理器中使用JavaScript)

var i;
var count = vars.get("AuthStatus_matchNr");
var EpisodeID;

log.info("Count of Status:"+count)

for(i=0;i<=count;i++){
    var AuthStatus_i;
    AuthStatus_i = vars.get("AuthStatus_"+i);
    log.info("Auth:"+AuthStatus_i);
    if (AuthStatus_i == "N"){
    EpisodeID = vars.get("corr_EpisodeID_"+i);
    break;
    }
else{
    i++;
    }
}
log.info("EpisodeID:"+EpisodeID)
vars.put("EpisodeID",EpisodeID);

但是我的循环并没有像预期的那样工作。循环运行2次迭代,并在找到N状态之前中断。下面是日志响应

Capture 'N' Status EpisodeID: Count of Status:3
Capture 'N' Status EpisodeID: Auth:null
Capture 'N' Status EpisodeID: Auth:A
Capture 'N' Status EpisodeID: EpisodeID:undefined
zzzyeukh

zzzyeukh1#

您需要删除此位:

else {
        i++;
    }

因为你已经在for循环中执行增量。
另外,请注意,根据JMeter最佳实践,您应该使用JSR223测试元素和Groovy语言进行脚本编写,因此考虑迁移。
更多信息:Apache Groovy: What Is Groovy Used For?

weylhg0b

weylhg0b2#

我知道问题在哪了。在JavaScript中,数组和列表是从零开始的,这意味着索引从0开始,最后一个索引是count - 1。因此,您需要将条件i <= count修改为i < count,以便遍历AuthStatus数组中的所有元素。
正确的做法应该是这样的:

var i;
var count = vars.get("AuthStatus_matchNr");
var EpisodeID;

log.info("Count of Status: " + count);

for (i = 0; i < count; i++) {
    var AuthStatus_i = vars.get("AuthStatus_" + i);
    log.info("Auth: " + AuthStatus_i);

    if (AuthStatus_i === "N") {
        EpisodeID = vars.get("corr_EpisodeID_" + i);
        break;
    }
}

log.info("EpisodeID: " + EpisodeID);
vars.put("EpisodeID", EpisodeID);

现在基本上循环将遍历所有元素,直到找到“N”状态并分配相应的EpisodeID。

相关问题