Gatling 基于 Scala 开发的压测工具,我们可以通过录制自动生成脚本,也可以自己编写脚本,大家不用担心,首先脚本很简单常用的没几个,另外 gatling 封装的也很好我们不需要去专门学习 Scala 语法,当然如果会的话会更好。

脚本示例

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BaiduSimulation extends Simulation {
  //设置请求的根路径
  val httpConf = http.baseURL("https://www.baidu.com")
  /*
    运行100秒 during 默认单位秒,如果要用微秒 during(100 millisecond)
   */
  val scn = scenario("BaiduSimulation").during(100){
    exec(http("baidu_home").get("/"))
  }
  //设置线程数
//  setUp(scn.inject(rampUsers(500) over(10 seconds)).protocols(httpConf))
  setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))
}

脚本编写

Gatling 脚本的编写主要包含下面三个步骤

我们以百度为例,进行第一个 GET 请求测试脚本的编写,类必须继承 Simulation

  1. 配置下 head,只是简单的请求下百度首页,所以只定义下请求的 base url,采用默认的 http 配置即可 //设置请求的根路径 val httpConf = http.baseURL("https://www.baidu.com")
  2. 声明 Scenario,指定我们的请求动作

    val scn = scenario("BaiduSimulation").
    exec(http("baidu_home").get("/"))
    

    scenario 里的参数:scenario name
    exec() 里的参数就是我们的执行动作,http("本次请求的名称").get("本次 http get 请求的地址")

  3. 设置并发数并组装

    //设置线程数
    setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))
    

    atOnceUsers:立马启动的用户数,可以理解为并发数

这样我们一个简单的脚本就完成了,可以运行看下效果。

高级教程

Injection -- 注入

注入方法用来定义虚拟用户的操作

setUp(
  scn.inject(
    nothingFor(4 seconds), // 1
    atOnceUsers(10), // 2
    rampUsers(10) over(5 seconds), // 3
    constantUsersPerSec(20) during(15 seconds), // 4
    constantUsersPerSec(20) during(15 seconds) randomized, // 5
    rampUsersPerSec(10) to 20 during(10 minutes), // 6
    rampUsersPerSec(10) to 20 during(10 minutes) randomized, // 7
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30), // 9
    heavisideUsers(1000) over(20 seconds) // 10
  ).protocols(httpConf)
)
  1. nothingFor(duration):设置一段停止的时间
  2. atOnceUsers(nbUsers):立即注入一定数量的虚拟用户 setUp(scn.inject(atOnceUsers(50)).protocols(httpConf))
  3. rampUsers(nbUsers) over(duration):在指定时间内,设置一定数量逐步注入的虚拟用户 setUp(scn.inject(rampUsers(50) over(30 seconds)).protocols(httpConf))
  4. constantUsersPerSec(rate) during(duration):定义一个在每秒钟恒定的并发用户数,持续指定的时间 setUp(scn.inject(constantUsersPerSec(30) during(15 seconds)).protocols(httpConf))
  5. constantUsersPerSec(rate) during(duration) randomized:定义一个在每秒钟围绕指定并发数随机增减的并发,持续指定时间 setUp(scn.inject(constantUsersPerSec(30) during(15 seconds) randomized).protocols(httpConf))
  6. rampUsersPerSec(rate1) to (rate2) during(duration):定义一个并发数区间,运行指定时间,并发增长的周期是一个规律的值 setUp(scn.inject(rampUsersPerSec(30) to (50) during(15 seconds)).protocols(httpConf))
  7. rampUsersPerSec(rate1) to(rate2) during(duration) randomized:定义一个并发数区间,运行指定时间,并发增长的周期是一个随机的值 setUp(scn.inject(rampUsersPerSec(30) to (50) during(15 seconds) randomized).protocols(httpConf))
  8. heavisideUsers(nbUsers) over(duration):定义一个持续的并发,围绕和海维赛德函数平滑逼近的增长量,持续指定时间(译者解释下海维赛德函数,H(x) 当 x>0 时返回 1,x<0 时返回 0,x=0 时返回 0.5。实际操作时,并发数是一个成平滑抛物线形的曲线) setUp(scn.inject(heavisideUsers(50) over(15 seconds)).protocols(httpConf))
  9. splitUsers(nbUsers) into(injectionStep) separatedBy(duration):定义一个周期,执行 injectionStep 里面的注入,将 nbUsers 的请求平均分配 setUp(scn.inject(splitUsers(50) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds)).protocols(httpConf))
  10. splitUsers(nbUsers) into(injectionStep1) separatedBy(injectionStep2):使用 injectionStep2 的注入作为周期,分隔 injectionStep1 的注入,直到用户数达到 nbUsers setUp(scn.inject(splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30)).protocols(httpConf))
循环
val scn = scenario("BaiduSimulation").
    exec(http("baidu_home").get("/"))

上面的测试代码运行时只能跑一次,为了测试效果,我们需要让它持续运行一定次数或者一段时间,可以使用下面两个方式:

POST 请求

post 参数提交方式:

Feed 动态参数

Gatling 对参数的处理称为 Feeder[供料器],支持主要有:


↙↙↙阅读原文可查看相关链接,并与作者交流