目录
了解 Gatling 模拟的主要部分:DSL 导入、场景定义、模拟定义、挂钩
Simulation 是您的测试必须扩展的父类,以便 Gatling 可以启动它们。
我们建议您的模拟名称不要以 Test 开头。 一些工具,如 maven surefire 积极地考虑所有具有这种命名模式的类都是由他们处理的,他们会尝试启动它们。
DSL导入
Gatling DSL 需要一些导入:
// Gatling核心结构DSL需要的
import io.gatling.core.Predef._
// Gatling HTTP DSL需要的
import io.gatling.http.Predef._
// 如果不使用 jdbcFeeder 可以省略
import io.gatling.jdbc.Predef._
// 用于以单位指定持续时间,例如“5 分钟”
import scala.concurrent.duration._
不要试图用你的IDE“优化导入”,你会破坏一切。 只需将这些导入复制粘贴到您想使用 Gatling DSL 的任何地方。
请注意,任何不属于这些包的类都被认为是私有的,而不是 API,因此可能随时更改,恕不另行通知。
setUp
您的大部分测试都可以提取到其他帮助类中,因此您可以使用自己的测试库:场景、协议、headers、注入配置文件等。
模拟中唯一的强制性部分是它们必须在其构造函数中仅调用一次 setUp 方法来注册测试组件。
val scn = scenario("scn") // etc...
setUp(
scn.inject(atOnceUsers(1))
)
这对应于将一个用户注入到 scn 场景中。
在同一个模拟中可能有多个群体,即具有相关注入配置文件的场景:
val scn1 = scenario("scn1") // etc...
val scn2 = scenario("scn2") // etc...
setUp(
scn1.inject(atOnceUsers(1)),
scn2.inject(atOnceUsers(1))
);
有关场景的更多信息,请参阅此处的专用部分。
有关注入配置文件的更多信息,请参阅此处的专用部分。
协议配置
可以附加协议配置
- 要么在设置上,在这种情况下,它们将应用于所有场景
- 或在每个场景上,因此它们可以具有不同的配置
// 全局配置的 HttpProtocol
setUp(
scn1.inject(atOnceUsers(1)),
scn2.inject(atOnceUsers(1))
).protocols(httpProtocol)
// 在每个场景上配置不同的 HttpProtocols
setUp(
scn1.inject(atOnceUsers(1))
.protocols(httpProtocol1),
scn2.inject(atOnceUsers(1))
.protocols(httpProtocol2)
)
有关协议配置的更多信息,请参阅此处的HttpProtocol 部分。
验收标准
断言是在 setUp 上配置的。
setUp(scn.inject(atOnceUsers(1)))
.assertions(global.failedRequests.count.is(0))
有关断言的更多信息,请参阅此处的专用部分。
全局暂停配置
可以使用多种方法在 Simulation 上配置暂停:
// 全局的暂停配置
setUp(scn.inject(atOnceUsers(1)))
// 禁用模拟暂停
.disablePauses
// 每个暂停的持续时间是在 `pause(duration)` 元素中指定的。
.constantPauses
// 每个暂停的持续时间平均是在 `pause(duration)` 元素中指定的,并且遵循均匀分布。
.uniformPauses(0.5)
.uniformPauses(2.seconds)
// 每个暂停的持续时间平均是在 `pause(duration)` 元素中指定的,并且遵循指数分布。
.exponentialPauses
// 暂停持续时间由提供的函数计算(以毫秒为单位)。 在这种情况下,已填充的持续时间被绕过。
.customPauses(session => 5L)
// 在每个场景上配置不同的暂停配置
setUp(
scn1.inject(atOnceUsers(1))
.disablePauses,
scn2.inject(atOnceUsers(1))
.exponentialPauses
)
塑造吞吐量
一些用户可能希望根据每秒吞吐量/请求而不是虚拟用户进行推理。
如果您的虚拟用户每个只执行一个请求,您应该为此使用开放式工作负载模型,例如 constantUsersPerSec。
否则,在我们看来,您将遇到麻烦,因为您将无法控制执行哪个请求。
不过,您可以尝试使用可以全局或按场景定义的节流方法。
节流的效果是:
- 禁用所有暂停
- 限制您的吞吐量。 一旦禁用暂停,它就无法生成高于模拟通常生成的吞吐量。
目前仅 HTTP 请求和 JMS 支持限制。
- Gatling 将在节流结束时自动中断您的测试,就像使用 maxDuration 一样。
请注意,所有多余的流量都会被推入无界队列,如果您的正常吞吐量远高于正常吞吐量,可能会导致 OutOfMemoryError。
// 全局配置的节流配置文件
setUp(scn.inject(constantUsersPerSec(100).during(30.minutes)))
.throttle(
reachRps(100).in(10),
holdFor(1.minute),
jumpToRps(50),
holdFor(2.hours)
)
// 全局配置的不同限制配置文件
setUp(
scn1.inject(atOnceUsers(1))
.throttle(reachRps(100).in(10)),
scn2.inject(atOnceUsers(1))
.throttle(reachRps(20).in(10))
)
该模拟将以 10 秒的斜率达到 100 req/s,然后保持此吞吐量 1 分钟,跳转到 50 req/s,最后保持此吞吐量 2 小时。
节流的构建块是:
- reachRps(target).in(duration):在给定持续时间内达到目标的吞吐量。
- jumpToRps(target):立即跳转到给定的目标吞吐量。
- holdFor(duration):在给定的持续时间内保持当前的吞吐量。
in是 Kotlin中的保留关键字。 您可以使用反引号 `in` 保护它,也可以使用 during 别名。
最长持续时间
最后,使用maxDuration您可以根据持续时间限制强制终止运行,即使某些虚拟用户仍在运行。
如果您需要在无法预测的情况下限制模拟的持续时间,它会很有用。
setUp(scn.inject(rampUsers(1000).during(20.minutes)))
.maxDuration(10.minutes)
Hooks(勾子)
Gatling 提供了两个钩子:
- before 用于在模拟实际运行之前执行一些任意代码
- after 用于在模拟实际运行后执行一些任意代码
生命周期如下:
- 1.gatling开始
- 2.模拟构造函数被调用,类体中的所有代码在执行钩子之前和之后没有延迟
- 3.在钩子执行之前
- 4.模拟运行
- 5.模拟终止
- 6.钩子执行后
- 7.如果启用,则会生成 HTML 报告
- 8.gatling关闭
before {
println("Simulation is about to start!")
}
after {
println("Simulation is finished!")
}
您将无法在其中使用 Gatling DSL,因为它仅用于负载测试。 您只能使用自己的代码。 如果您正在寻找执行 Gatling DSL,您可能会考虑使用顺序方案。