当前位置: 首页 > 测试知识 > Gatling中的三个错误处理机制:tryMax、exitBlockOnFail和exitHereIfFailed
Gatling中的三个错误处理机制:tryMax、exitBlockOnFail和exitHereIfFailed
2025-12-29 作者cwb 浏览次数18

Gatling性能测试的tryMax、exitBlockOnFail和exitHereIfFailed是三个用来控制虚拟用户执行流程的函数,在处理预期可能失败的操作时比较重要。区别是错误处理和失败后的流程走向。

Gatling DSL描述的是虚拟用户的行为链,这些机制是在行为链上设定的流程控制规则。


tryMax:重试机制。为一段可能失败的操作提供“多次尝试”的机会。块级作用域。控制其包裹的整个代码块。如果块内所有尝试都失败,则继续执行tryMax之后的链式步骤。处理不稳定但可恢复的操作,如获取一个可能过期的Token、重试一个偶发失败的支付请求。 只能对链式元素(如HTTP请求、动作)生效。不能直接包装纯Scala控制流代码(如if判断)。


exitBlockOnFail:快速失败和退出。将一段代码块声明为“重点区块”,其内的首个失败会立即跳出该区块。 块级作用域。控制其包裹的整个代码块。一旦失败,立即退出该代码块,并继续执行exitBlockOnFail之后的步骤。保护前置重点步骤。如,登录失败后,后续的查询、下单等操作无需也不应再执行。常和tryMax结合使用,实现“重试直到成功,否则提前退出重点流程”。


exitHereIfFailed:立即结束用户。检查至此虚拟用户是不是已失败,如果失败则立即优雅地结束该虚拟用户实例。点状检查。它是一个检查点,影响的是整个虚拟用户的存续。如果检查点之前存在未处理的失败,则结束该用户会话,不再执行后续任何步骤。在业务流程的重点节点进行最后检查,避免无意义的后续操作浪费资源。如,重要购物车加载失败后,直接结束用户,而不是继续“模拟”结账。检查的是用户状态,而不是前一步骤的简单结果。一般和tryMax和exitBlockOnFail组合,用于处理经过重试后仍无法恢复的致命失败。


组合使用

tryMax的重试思路


scala

// 尝试最多3次来执行这个HTTP请求链

tryMax(3) { // 重试块开始

  exec(http("Get Token")

    .get("/api/token")

    .check(jsonPath("$.token").saveAs("authToken")))

} // 重试块结束

// 不管重试成功和否,虚拟用户都会继续执行到这里


重点:每次重试都会完整执行块内所有步骤。某次尝试成功,就立即跳出tryMax块,继续执行后续步骤。


exitBlockOnFail的区块保护


scala

exitBlockOnFail { // 重点区块开始:任何失败都将导致退出本区块

  exec(login) // 登录

  .exec(loadDashboard) // 加载仪表板

} // 重点区块结束

// 只有在重点区块完全成功的情况下,才会执行到这里的“浏览商品”步骤

exec(browseProducts)


这是要么全做,要么到此为止的思路。保证了后续步骤(如browseProducts)的执行。


exitHereIfFailed的检查

exitHereIfFailed本身不执行任何操作,只做状态检查。功能是和错误处理机制结合的。


scala

val scn = scenario("My Scenario")

  .exec(login)

  .exitBlockOnFail {

    exec(addToCart)

    .exec(checkout)

  }

  // 检查点:如果之前exitBlockOnFail块因失败而退出,则用户在此结束

  .exitHereIfFailed

  // 只有重点购物流程完全成功的用户,才会继续执行支付步骤

  .exec(makePayment)


在这个组合中exitBlockOnFail负责在失败时跳过checkout,而exitHereIfFailed就保证跳过checkout的用户不会去执行makePayment。

文章标签: 软件测试 测试工具
咨询软件测试