Gatling如何按倍数线性规则递增用户数并按响应时间阈值终止测试
Gatling 需求实现方案
需求1:线性递增用户数注入
- Gatling 内置的
rampUsersPerSec方法原生支持速率线性增长,完全匹配你要的5n类线性递增需求:该方法可以指定起始注入速率、目标注入速率,以及线性增长的持续时长,速率会在指定时长内均匀从起始值增长到目标值。 - 比如你要在4分钟内,每秒新增用户数从0线性增长到20(即第1分钟速率5/秒、第2分钟10/秒、第3分钟15/秒、第4分钟20/秒,符合5n(n为分钟数)的线性规则),直接替换你原来的
constantUsersPerSec(5) during (4 minutes)即可,也可以根据实际需求调整起始/目标速率值。
需求2:响应时间超阈值实时自动终止
- 你当前用的
assertions是测试结束后才执行的结果校验,无法实现实时终止。需要自定义Gatling的SimulationListener监听器,实时统计响应时间指标,超过阈值时主动终止测试。如果需要判断的是全局平均响应时间而非单次响应时间,可在监听器内新增计数器统计总请求数、总响应时间自行计算即可。
完整调整后的代码示例
// 导入基础依赖 import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._ import io.gatling.core.controller.Controller import io.gatling.core.session.Session import io.gatling.core.listener.SimulationListener import io.gatling.http.response.Response class YourSimulation extends Simulation { // 原有参数定义,可根据实际需求修改 val tempsReponseLimiteAvantEchecEnMillisecondes = 2000 val dureeDuTestEnMinutes = 5 // 自定义监听器实现实时校验终止 val responseTimeCheckListener = new SimulationListener { override def onResponse(response: Response): Unit = { // 单次响应时间超过阈值直接终止测试 if (response.responseTime.toMillis > tempsReponseLimiteAvantEchecEnMillisecondes) { Controller.stop() } } // 空实现不需要的钩子方法 override def onSimulationStart(): Unit = {} override def onSimulationEnd(): Unit = {} override def onScenarioStart(session: Session): Unit = {} override def onScenarioEnd(session: Session): Unit = {} override def onRequestStart(session: Session, requestName: String): Unit = {} } // 注册自定义监听器 setUp( scenario(10).inject( atOnceUsers(1) ).protocols(httpProtocol), scenarioService(5000).inject( nothingFor((10 + 10) seconds), // 替换原有固定速率为线性递增速率 rampUsersPerSec(0).to(20).during(4 minutes) ).protocols(httpProtocol) ) .maxDuration(dureeDuTestEnMinutes minutes) // 保留原有的结束后断言,也可以根据需求删除 .assertions( global.responseTime.max.lt(tempsReponseLimiteAvantEchecEnMillisecondes) ) .protocols(httpProtocol) // 添加自定义监听器 .addListener(responseTimeCheckListener) }
内容的提问来源于stack exchange,提问作者Nesan Mano
相关产品推荐
相关产品推荐

