Gatling是一个很好的负载测试工具,但DSL让我感到困惑。问题是我已经有自定义请求和模型类,我想创建某种“桥”类来将现有类移植到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)...
这显然不起作用,
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
答案 0 :(得分:0)
你不明白的是Gatling DSL组件是不可变的构建器,它们在加载Simulation时只被解析和链接一次,只有一次。
因此,你可以:
所有这些都发生在运行时,即稍后。
你的第一个exec工作(即使我会建议反对一个可变设计),因为块内容是静态的,请求确实构建一次。
你的第二个exec实际上每次执行时都会创建一个新的请求构建器,但它只是被丢弃了。
如果你真的想编写自己的DSL,你必须接受Gatling的工作方式。您不能只使用已解决的值,例如setId
,您也必须能够Expression。
另请注意,保存整个响应主体并为每次执行创建新的ObjectMapper的方式既麻烦又低效。
您只需使用JsonPath检查即可获取您感兴趣的单个ID,然后使用Gatling EL将保存的值注入下一个请求。