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。