我有这个脚本,它有 3 个 api 调用,其中第一个 api 调用的响应包含一个“id”字段,应该传递给其他两个后续 api 调用。
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class MySimulation extends Simulation {
val httpProtocol = http
.baseUrl("https://api.example.com")
.header("Content-Type", "application/json")
val organizationId = "org123"
val locationId = "loc123"
val serviceId = "svc123"
val scn = scenario("My Scenario")
.exec(http("Create Walkin")
.post(s"/organizations/${organizationId}/locations/${locationId}/services/${serviceId}/resources/walkins")
.body(StringBody("""{ "source": "WEB_KIOSK" }""")).asJson
.check(jsonPath("$.id").saveAs("walkInId")))
.exec(session => {
val walkInId = session("walkInId").as[String]
session
})
.exec(http("Update Walkin Fields")
.put(s"/organizations/${organizationId}/locations/${locationId}/walkins/${walkInId}/fields")
.body(StringBody("""{
"internalName": "First Name",
"values": ["Steve"]
},
{
"internalName": "Phone Number",
"values": ["+11010101010"]
},
{
"internalName": "Email",
"values": ["[email protected]"]
}""")).asJson)
.exec(http("Schedule Walkin")
.put(s"/organizations/${organizationId}/locations/${locationId}/resources/walkins/${walkInId}")
.body(StringBody("""{ "action": "SCHEDULE", "source": "WEB_KIOSK" }""")).asJson)
setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}
当我运行这个脚本时,我收到如下错误消息
not found: value walkInId
.put(s"/organizations/${organizationId}/locations/${locationId}/walkins/${walkInId}/fields")
^
13:42:33.204 [ERROR] i.g.c.ZincCompiler$ - ./user-files/simulations/Test2.scala:63:89: not found: value walkInId
.put(s"/organizations/${organizationId}/locations/${locationId}/resources/walkins/${walkInId}")
^
问题的原因是你使用了字符串插值。
s"/organizations/${organizationId}/locations/${locationId}/walkins/${walkInId}/fields"
s
表示使用代码中的变量而不是 Gatling 的 Session 变量,而您的 ${walkInId}
正试图在类中找到这个变量。为避免这种情况,您需要转义字符,只需添加额外的$
:
s"/organizations/${organizationId}/locations/${locationId}/walkins/$${walkInId}/fields"