【问题标题】:Rerun getToken(authorization) requests only on expiry - Jmeter仅在到期时重新运行 getToken(授权)请求 - Jmeter
【发布时间】:2021-09-01 10:10:00
【问题描述】:

我的测试计划如下:

  • get token:获取访问令牌的请求
    • 设置用户定义变量以获取 tokenGeneratedTime,假设 tokenGeneratedTime 为 ${__time(,)}
  • 检查令牌是否过期(如果控制器) - {__jexl3((${__time(,)} - ${tokenGenerationTime}) > 3599000)}
    • 如果为真,则去获取令牌采样器
    • 如果为 false,则转到后续请求
  • 一些 https 请求

因此,如果我第一次运行此测试计划(仅 1 次迭代),获取令牌的请求将被触发,条件将被评估为 false 并触发后续请求。一切都很好。但是正如您所看到的,如果我第二次立即再次运行测试计划(而不是迭代),则会再次触发获取令牌(授权)请求,这是不需要的。我需要在到期时调用获取令牌请求。

如果令牌未过期,我正在考虑将变量设置为 false,并将获取令牌请求置于 if 控制器下。但是如何在 if 控制器中设置变量呢?

如果您有任何其他方法可以实现这一点,请提出建议。

TIA

【问题讨论】:

  • 理想情况下,您应该在令牌过期时请求令牌。令牌过期时会收到什么消息?
  • 令牌请求没有说明任何关于到期的信息。它只是返回令牌。当我在后续的 Http 请求中使用令牌时,如果返回 401,则表示令牌已过期。
  • 刚刚更新了答案以检查响应代码401而不是响应消息。

标签: jmeter performance-testing


【解决方案1】:
  1. 使用标志来检查令牌到期。例如isTokenExpired

  2. User Defiled Variables 部分定义变量并将值设置为true。这将确保令牌请求第一次被触发。

  3. 在令牌请求中添加IF Controller 并检查条件${tokenExpired}。成功创建令牌时,将标志设置为falsevars.put("tokenExpired","false")

  1. JSR223 Postprocessor 添加到顶层并检查响应代码401 以获取令牌到期响应。如果令牌已过期,请将标志 isTokenExpired 设置为 true 并立即将线程重定向到下一次迭代 ctx.setTestLogicalAction(org.apache.jmeter.threads.JMeterContext.TestLogicalAction.START_NEXT_ITERATION_OF_THREAD

String responseCode=prev.getResponseCode()


if (responseCode.equals("401")) {
    log.info("Token is expired ")
    vars.put("tokenExpired","true")
    ctx.setTestLogicalAction(org.apache.jmeter.threads.JMeterContext.TestLogicalAction.START_NEXT_ITERATION_OF_THREAD )
}

【讨论】:

  • 感谢@Janesh Kodikara 的回复。我有几个后续问题,在提到的第 3 步中,我在哪里将 isTokenExpired 设置为 false,我应该使用后处理器还是其他东西,如果我不想在到期时进行下一次迭代,可以做什么,但只是为了获取令牌并从 http 请求失败的地方继续说 401。对不起,如果我的问题听起来很愚蠢。我是 jmeter 的菜鸟。 TIA。
  • 您可以从 JSR223 后处理器本身请求一个令牌,以便从您停止的地方继续。我看不到从顶部跳转并从停止位置恢复请求的快速解决方案。
  • 我会试着弄清楚。顺便说一句,您在 JSR223 后处理器中使用的脚本语言是什么,是 beanshell 吗?
  • 我正在使用Groovy。 Groovy 是推荐的脚本语言。
【解决方案2】:

如果我立即再次运行测试计划(不迭代)

如果您第二次运行测试计划,这意味着您的 tokenGenerationTime 变量将获得一个新的当前时间戳值,该值等于第二次执行的开始时间。

如果您希望能够在 1 小时内第二次运行您的测试计划而不触发令牌生成请求,您可以考虑使用 __StringToFile() 函数将 tokenGenerationTime 写入文件并在第二次从文件中读取它和使用__FileToString() function 的其他测试执行,或者如果您的逻辑更复杂,您可以使用__groovy() function 并在那里实现您想要的任何东西

有关 JMeter 函数概念的更多信息:Apache JMeter Functions - An Introduction

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多