Gatling 2 如何检测 DSL
Gatling 2 how to instrument the DSL
Gatling 是进行负载测试的好工具,但 DSL 不知何故让我感到困惑。问题是我已经有了自定义请求和模型 classes,我想创建某种 "bridge" class 来将现有的 classes 移植到 DSL 中。
这是一个例子:
exec {
val request = new GetIdRequest()
request.setCountry("US")
request // There is an implicit conversion
.check(status.is(200), bodyString.saveAs("ids"))
}.exec {
session =>
val ids = new ObjectMapper().readValue(session("ids").as[String], classOf[IdList])
val request = new GetObjectRequest()
val request.setId(id(0))
request // There is an implicit conversion
.check(status.is(200), bodyString.saveAs("object"))
session
}
其中隐式转换只是将 request
转换为 http(...).get(url)...
这显然不行,
- session 是不可变的,因此 "object" 值不会保存到 session
第二个exec
中的request
没有执行,因为没有直接传入exec
那么怎样才能达到想要的效果呢?有没有我可以采用的示例,或者我是否必须实现自己的 ActionBuilder
(我不想这样做,因为这就像编写另一个协议)?谢谢
更新 1
这是我想出的解决方案。
我创建了这个翻译器方法
def createHttp(name: String, req: Session => HttpRequest): HttpRequestBuilder = {
http(name)
.get {
session => req(session).getUri
}
.header("Content-Type", "application/json")
.header("Authorization", {
session =>
val r = req(session)
Authorization.create("GET", r.getUri, appId, appKey)
})
}
然后我只需要传入一个创建 HttpRequest
的函数
您不明白的是,Gatling DSL 组件是不可变的构建器,在加载模拟时仅解析和链接一次。
因此,您可以:
- 会话函数中都没有生成请求
- 也不会手动传递一些从 Session 中解析出来的数据
所有这些都发生在运行时,即稍后。
你的第一个 exec 工作(尽管我建议不要使用可变设计)因为块内容是静态的请求确实构建了一次。
您的第二个 exec 实际上每次执行时都会创建一个新的请求构建器,但它只是被丢弃了。
如果你真的想编写自己的 DSL,你必须接受 Gatling 的工作原理。你不能让它只接受解析值,比如你的 setId
,你也必须能够接受 Expressions。
另请注意,您保存整个响应主体并为每次执行创建新的 ObjectMapper 的方式既麻烦又低效。
您可以简单地使用 JsonPath check to grab the single id you're interested in, and then use Gatling EL 将保存的值注入下一个请求。
Gatling 是进行负载测试的好工具,但 DSL 不知何故让我感到困惑。问题是我已经有了自定义请求和模型 classes,我想创建某种 "bridge" class 来将现有的 classes 移植到 DSL 中。
这是一个例子:
exec {
val request = new GetIdRequest()
request.setCountry("US")
request // There is an implicit conversion
.check(status.is(200), bodyString.saveAs("ids"))
}.exec {
session =>
val ids = new ObjectMapper().readValue(session("ids").as[String], classOf[IdList])
val request = new GetObjectRequest()
val request.setId(id(0))
request // There is an implicit conversion
.check(status.is(200), bodyString.saveAs("object"))
session
}
其中隐式转换只是将 request
转换为 http(...).get(url)...
这显然不行,
- session 是不可变的,因此 "object" 值不会保存到 session 第二个
request
没有执行,因为没有直接传入exec
exec
中的那么怎样才能达到想要的效果呢?有没有我可以采用的示例,或者我是否必须实现自己的 ActionBuilder
(我不想这样做,因为这就像编写另一个协议)?谢谢
更新 1
这是我想出的解决方案。
我创建了这个翻译器方法
def createHttp(name: String, req: Session => HttpRequest): HttpRequestBuilder = {
http(name)
.get {
session => req(session).getUri
}
.header("Content-Type", "application/json")
.header("Authorization", {
session =>
val r = req(session)
Authorization.create("GET", r.getUri, appId, appKey)
})
}
然后我只需要传入一个创建 HttpRequest
您不明白的是,Gatling DSL 组件是不可变的构建器,在加载模拟时仅解析和链接一次。
因此,您可以:
- 会话函数中都没有生成请求
- 也不会手动传递一些从 Session 中解析出来的数据
所有这些都发生在运行时,即稍后。
你的第一个 exec 工作(尽管我建议不要使用可变设计)因为块内容是静态的请求确实构建了一次。
您的第二个 exec 实际上每次执行时都会创建一个新的请求构建器,但它只是被丢弃了。
如果你真的想编写自己的 DSL,你必须接受 Gatling 的工作原理。你不能让它只接受解析值,比如你的 setId
,你也必须能够接受 Expressions。
另请注意,您保存整个响应主体并为每次执行创建新的 ObjectMapper 的方式既麻烦又低效。
您可以简单地使用 JsonPath check to grab the single id you're interested in, and then use Gatling EL 将保存的值注入下一个请求。