核心:模拟

目录

DSL导入

setUp

协议配置

验收标准

全局暂停配置

塑造吞吐量

最长持续时间

Hooks(勾子)


了解 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,您可能会考虑使用顺序方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值