jmeter 如何将while循环中的值作为属性存储到列表中

ux6nzvsh  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(208)

是否有方法将从循环控制器中检索到的每个会话ID添加到列表中,并将其分配给一个属性,以便在以下线程组中使用?下面我使用了几个虚拟采样器来解释我的要求。
我将3个用户存储在一个列表中,以检索setUp Thread Group中的3个会话ID。
JSR 223预处理器

List usernames = Arrays.asList('Peter', 'Alex', 'Mary');
props.put('accounts', usernames);

我能够从该属性中读取用户名,从而在循环控制器中的每次迭代中相应地获得响应中的会话ID。

"sessionId": "this_is_my_session_id-${__groovy(props.get('accounts').get(${__jm__LoopController__idx} % 3),)}-${__jm__LoopController__idx} "

我通过JSR 223后处理器解析出3个会话ID

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

def jsonSlurper = new JsonSlurper();
def response = jsonSlurper.parseText(prev.getResponseDataAsString());
def json = JsonOutput.toJson(response.sessionId)
def sessionId = new JsonSlurper().parseText(json)
log.info('The session id is:' + sessionId)

ArrayList<String> sessionIds = new ArrayList<String>();
props.put("sessionIds", sessionIds.add(sessionId))

我需要将这3个会话ID添加到一个列表中,并将其分配给一个属性,这样我就可以在以下线程组中的每个VU/线程的属性中使用一个会话ID。但它没有按预期工作。它抛出了错误消息 *No such property:会话ID *

${__groovy(props.get(sessionIds).get(${__jm__UseSession__idx} % 3),)}
wz8daaqr

wz8daaqr1#

我们不知道你“期望”什么
最可能的问题就在这里:

props.put("sessionIds", sessionIds.add(sessionId))

Collection.add()函数返回一个boolean值,因此它将true放入sessionIds属性,而不是ArrayList的真实的值。
因此,我认为您需要将其更改为:

sessionIds.add(sessionId)
props.put("sessionIds", sessionIds)

如果您要在循环中运行JSR 223测试元素,您还可以重新考虑初始化sessionIds的方式,并实现以下逻辑:
1.如果sessionIds属性存在-读取其值
1.如果它不存在-创建一个新的数组列表
类似于:

ArrayList<String> sessionIds = props.get("sessionIds") ?: new ArrayList<String>()

有关JMeter中的Groovy脚本的更多信息:Apache Groovy: What Is Groovy Used For?

相关问题