JMeter 变量更新在子 while 循环中被忽略

问题描述 投票:0回答:1

我有一个使用 Websocket 运行的测试。 我有 2 条消息需要写入 websocket 并监听响应(附加

message
并在 EOF 返回时关闭监听器。 对于一条消息它可以正常工作,但是当我尝试使用 2 条消息运行时,它就崩溃了。

过程(>的for循环深度):

  1. 加载代币、加载问题、进行 WS 握手、设置变量
    questionCounter = 0
    done = "false"
    (全部工作方式为 预计)
  2. 添加
    Loop Controller
    (循环计数2)
  3. > 添加
    Counter
    用于跟踪 [变量名称为
    counterA
    ]
  4. >添加
    JSR223 script
    用于设置变量
    questionCounter = 1
    (添加此脚本作为调试和尝试其他解决方案的一部分)
  5. >[添加了 300 毫秒的计时器,以防上述脚本中保存变量出现延迟](绝望并尝试一切)
  6. >向 WS 发送请求 (
    Write Sampler
    )(在查看
    Results Tree
    中的结果时按预期工作 - 耶 [我正在使用步骤 3 中的循环计数器
    counterA
    来获取正确的问题]

问题开始:

  1. >
    While Controller
    关闭时
    done = "true"
  2. >>为名为
    While Controller
    counterB
  3. 添加计数器
  4. >>
    Read Sampler
    Results Tree
  5. 中查看回复时获得预期结果

9A。 >>> 响应中

type
的正则表达式提取器,结果为
type_${question_counter}

9B。 >>> 响应中

target
的正则表达式提取器,结果为
target_${question_counter}

9C。 >>> 响应中

messages
的正则表达式提取器,结果为
messages_${question_counter}

[是的,我有 3 个独立的提取器,因为我不知道响应中道具的顺序]

  1. >>

    JSR223 Script
    附加上面的消息并将它们保存到 props 中,但是当将这些消息保存到使用
    questionCounter
    counterA
    的键时,它总是使用 1 作为步骤 4 中设置的
    questionCounter
    (忽略
    questionCounter++
    vars.put
    )和
    counterA = 0
    ,即使是在第二次循环迭代中(它应该是 1)。

  2. >>

    JSR223 Script
    检查目标和类型以查看“EndOfMessages”是否已发送,如果是,则在计数器
    done = 'true'
    时关闭[再次,所有正则表达式结果都针对
    counterA
    的 0 或
     进行保存questionCounter
    的 `1 从第一个循环开始,甚至在第二个循环中]

  3. 然后在

    loop controller
    之后进行一些日志记录等。

我可以从

Debug Sampler
View Results Tree
看到“据说”更新的
messageCounter
counterA
没有改变值。我在
log.info
之前和之后都有
While Controller
,对于相同的
log.info("question_counter ${vars.get("question_counter")}")
,先显示“2”,然后显示“1”。

上面遗漏了很多调试采样器和日志记录,但我可以从

Results Tree
和控制台窗口看到它没有更新。

我尝试使用手动设置的

counterA
从父循环中交换
questionsCounter
,但都没有在
While Loop
内更新。

为什么循环忽略更新的值?

提前非常感谢。

performance testing groovy jmeter performance-testing
1个回答
0
投票

不幸的是,您的问题没有提供足够的详细信息以便被复制(至少对我来说)。我可以想到以下增强功能,也许其中之一可以帮助您继续:

  1. 您不需要任何“计数器”,控制器公开一个包含当前迭代次数的特殊变量:

    enter image description here

    它可以通过以下方式访问:

    ${__jm__While Controller Name Here__idx}

  2. 不要将

    ${something}
    形式的 JMeter 函数或变量内联到 Groovy 脚本中,因为只会编译和缓存第一个值,请参阅 JSR223 Sampler 文档了解更多详细信息

如果您仍然遇到问题,请使用虚拟采样器提出一个最小可重现示例并分享完整的测试脚本。

© www.soinside.com 2019 - 2024. All rights reserved.