gatling - Gatling 如何为以后的请求存储和加载值
问题描述
我想构建一个负载测试,其中第二个请求来自第一个响应。数据提取是在一种方法中完成的,因为它不仅仅是一行代码。我的问题是存储值(id)并稍后加载。值应该如何存储和加载?我尝试了一些不同的方法,并想出了这段代码。文档对我没有帮助。
object First {
val first = {
exec(http("first request")
.post("/graphql")
.headers(headers_0)
.body(RawFileBody("computerdatabase/recordedsimulation/first.json"))
.check(bodyString.saveAs("bodyResponse"))
)
.exec {
session =>
val response = session("bodyResponse").as[String]
session.set("Id", getRandomValueForKey("id", response))
session}
.pause(1)
}
}
object Second {
val second = {
exec(http("Second ${Id}")
.post("/graphql")
.headers(headers_0)
.body(RawFileBody("computerdatabase/recordedsimulation/second.json"))
)
.pause(1)
}
}
val user = scenario("User")
.exec(
First.first,
Second.second
)
setUp(user.inject(
atOnceUsers(1),
)).protocols(httpProtocol)
解决方案
您的问题是您没有正确使用会话。
从文档中:
警告
会话实例是不可变的!
为什么呢?因为 Session 是多线程并发处理的消息,所以不依赖于同步和阻塞,不可变是处理状态的最佳方式。
一个非常常见的陷阱是忘记 set 和 setAll 实际上返回新实例。
这正是您正在做的事情:
exec { session =>
val response = session("bodyResponse").as[String]
session.set("Id", getRandomValueForKey("id", response))
session
}
它应该是:
exec { session =>
val response = session("bodyResponse").as[String]
session.set("Id", getRandomValueForKey("id", response))
}
推荐阅读
- python-3.x - GCP-App Engine API 不可用,py 3
- php - php DOMDocument 允许输入 HTML 中的空属性?
- c# - 如何在 UserControl 中知道 MainWindow (Applicatoin) 何时关闭?- WPF
- masonite - 是否有获取 masonite 存储目录的绝对路径的辅助方法?
- swift - 如何在swift中通过另一个单个字符串值连接数组中的每个元素
- c++ - 我们如何取出字符串数组或字符串中的多个整数并将它们分配给不同的 int 数据类型?
- c++ - gdb“找不到方法...”(来自库的方法)
- windows - 致命:在 git clone 期间无法查找 user@example.com:port?
- tensorflow - 如何实现TF1到TF2中写的基于matmul的nn
- swift - Swift 协议继承和关联类型