【问题标题】:Handling Asynchronous API Call in Jmeter在 Jmeter 中处理异步 API 调用
【发布时间】:2019-08-16 11:32:22
【问题描述】:

我正在使用 Jmeter 进行功能测试,以下是我面临的一个问题,需要一些帮助/建议来解决这个问题。

我有一个由 2 个请求组成的线程组,第一个是 API 调用,第二个是向 Active MQ 发送消息。

现在的流程是我需要先调用 API(这将等待响应),然后将消息发送到特定的 Active MQ 队列,然后只有我会得到 API 的响应。

但是由于 jmeter 会顺序执行请求,因此它会卡在 API 调用等待回复并且永远不会执行第二部分。

我研究了以下解决方案,但即使这样也无济于事。

1 使用并行控制器,并将 API 和 ACtive MQ 调用放在同一个下。 2 将 Timer 添加到 Active MQ 调用中,使其在 API 调用之后执行(2 秒)

但是当我查看详细信息时,我发现两个请求是同时发送的,并且计时器在任何地方都没有生效。

有什么办法可以处理这种情况?

请注意,只有当我将消息发送到特定的 Active MQ 队列时,我才会收到对 API 的响应,否则它将在一分钟内超时。

【问题讨论】:

    标签: jmeter jmeter-plugins jmeter-5.0


    【解决方案1】:

    对于您的问题陈述,以下设计将起作用。

    • 使用 2 个线程组,将 API 调用添加到第一个线程组,将消息到 Active MQ 调用添加到第二个线程组
    • 为第二个线程组添加延迟,使其不应该在第一个线程组之前运行
    • 运行测试计划

    【讨论】:

    • 我希望它们成为 1 个线程组的一部分,我使用 jmeter 作为功能工具,我们将 1 个线程组表示为 1 个 TC,以及该线程中存在的所有采样器/断言组可以被视为测试步骤。
    【解决方案2】:

    使用while controller。它将继续执行直到期望的结果,然后执行下一个请求。

    希望这会有所帮助。

    更新:- 而 Loop 控制器执行其采样器,直到指定的条件未设置为 False。条件可以是最终计算结果为字符串“false”的任何变量或函数。

    因此,您需要在 While 循环中指定一个变量或函数,其值为“真”并在脚本中的其他位置变为“假”。一旦它变为“false”,JMeter 将退出 While 循环。

    例如,如果您在脚本中使用 X-Path 提取器,其中有一个名为 Status 的变量,并且它的值在执行期间从“开始”更改为“完成”,并且您希望执行脚本直到“完成”未满足,那么您可以在您的 While 循环中使用表达式 ${__javaScript("'${imp_Status}'!='finish'",)} ,它将在 While 控制器下执行采样器直到满足状态=完成。

    这是一种基于特定条件的轮询。在您的第一个 API 响应中,考虑一个值作为第一个 api 调用成功的条件。

    【讨论】:

    • 您能否详细说明这种方法,请提供更多细节。
    【解决方案3】:

    听起来你只需要定义timeout for HTTP Request,

    如果你定义Response Timeout为60000(毫秒),它只会等待一分钟然后继续下一个请求

    连接超时连接超时。等待连接打开的毫秒数。没有

    响应超时响应超时。等待响应的毫秒数。请注意,这适用于每次等待响应。如果服务器响应分多个块发送,则整体经过的时间可能会比超时时间长。

    【讨论】:

    • 不,我需要在第一个请求仍在执行时发送第二个请求(消息到 Active MQ)。
    【解决方案4】:
    1. 您的并行控制器方法将起作用,但是您需要稍微修改配置,例如:

    2. 您可以将您的 ActiveMQ 请求放在不同的线程组下,并使用Inter-Thread Communication Plugin 进行线程之间的同步
    3. 您可以保留当前设置,但将 JMS 采样器替换为 JSR223 Sampler 并以编程方式将消息发送到 ActiveMQ:

      为您提供方便的文本代码表示:

      sleep(2000)
      def connectionFactory = new org.apache.activemq.ActiveMQConnectionFactory('your activemq URL')
      def connection = connectionFactory.createConnection()
      connection.start()
      def session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
      def destination = session.createQueue('your queue name')
      def producer = session.createProducer(destination)
      def message = session.createTextMessage('your message body')
      producer.send(message)
      connection.close()
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多