Gatling使用的几个小技巧

30 12月
预计阅读时间: 1 分钟

Gatling是一个基于Scala,Akka和Netty的开源负载和性能测试框架,从功能上和JMeter很类似,只不过因为是基于DSL书写,从配置上来说灵活性比较好,当然相对的上手难度其实要大一些。

最近项目上使用了一下Gatling,用的时候还是遇到一些小问题。

Gradle插件运行

Gatling官网的运行方式是下载整个Gatling,然后编写脚本以后,直接运行。这个操作不是很方便的,找到一个Gradle插件可以快速运行,其中Gatling的版本,参数等都可以通过build.gradle的参数配置,使用上是比较灵活的。

插件的配置如下:

plugins {
    id 'scala'
    id "com.github.lkishalmi.gatling" version "3.0.2"
}

gatling {
    toolVersion = '3.0.0'
    jvmArgs = [ '-server', '-Xms512M', '-Xmx512M' ]
    simulations = {
        include "**/*.scala"
    }
}

目录结构的要求是src/gatling/simulations,这个需要自己改一下

读取配置

配置可以是很多东西,比如比较常见的是不同环境不同的数据,比如URL,用户认证信息,或者是压测的压力情况都应该在配置,而不是硬编码在代码中。

配置文件地址src/galting/resource/application.properties

使用的时候直接调用

val conf = ConfigFactory.load()
val httpConf = http.baseUrl(conf.getString("baseUrl"))
  ...
  ...

配置的内容可以文本,也可以是数字等。

参数传递

有时候测试一些API需要有关联,会存在一些参数传递。比如首先调用创建API,获取返回值中的id,然后测试修改API,需要在请求数据中包含该id。

Gatling提供的方法是session,可以自己写入,也可以从返回中提取。

val xx = scenario("XX管理")
    .exec(
      http("新建XX")
        .post("/xx/create")
        .check(status.is(200))
        .check(jsonPath("$.code").is("0"))
        .check(jsonPath("$.data.id").saveAs("xxId"))
    )
    .exec(
      http("更新XX")
        .post("/xx/update")
        .formParam("id", session => session("xxId").as[Int])
        .check(status.is(200))
        .check(jsonPath("$.code").is("0"))
    )

然后需要把session中的值注入请求中,而请求比较大,是存放在文件中的,可以使用ElFileBody

.exec { session => session.set("title", "标题" + ThreadLocalRandom.current.nextInt(10000)) }
  .exec(
    http("添加内容")
      .post("/content/save")
      .body(ElFileBody("json/save.json")).asJson
      .check(status.is(200))
  )

用户配置

Gatling可以指定模拟的用户量,比较简单的是atOnceUsers,这是一次性模拟一定数量的用户,但是很多时候我们需要一个缓慢增长的过程,比如用户在3秒中从1增加到100

setUp(
    scn.inject(
        rampUsers(10) over (5 seconds), 
        constantUsersPerSec(20) during (15 seconds), 
        rampUsersPerSec(10) to 20 during (10 minutes), 
        splitUsers(1000) into (rampUsers(10) over (10 seconds)) separatedBy (10 seconds),
        heavisideUsers(1000) over (20 seconds)
    ).protocols(httpConf)
)

具体用哪种看情况,但是一定要引入如下的包,不然seconds这些时间控制会一直报错

import scala.concurrent.duration._

Gatling测试结果

Gatling的默认测试结果是一个网页,可视化效果比起来JMeter要方便不上,但是有时候需要自定义的情况,可以直接从Gatling的结果文件中进行加工。以下是一些加工效果

发表评论

电子邮件地址不会被公开。