У меня есть этот скрипт, который имеет 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
перед строкой означает использование переменной из вашего кода вместо переменных сеанса Гатлинга, и ваш ${walkInId}
пытается найти эту переменную в классе. Чтобы избежать этого, вам нужно экранировать символ, просто добавьте дополнительный $
:
s"/organizations/${organizationId}/locations/${locationId}/walkins/$${walkInId}/fields"
ОБНОВЛЕНИЕ: Как сказал владелец Gatling - лучше обновить версию Gatling в своих тестах. Начиная с версии 3.7 Gatling предоставляет новый формат языка выражений, и вы можете использовать #{}
без проблем с интерполяцией. Вот вам страница, которая объясняет, как перейти на эту версию - https://gatling.io/docs/gatling/reference/current/upgrading/3.6-to-3.7/
@StéphaneLANDELLE Да, я полностью согласен с этим
Большое спасибо @Amerousful и StéphaneLANDELLE. Он хорошо работал с новым Gatling EL #{}.
Лучше: используйте новый синтаксис Gatling EL #{}, который не конфликтует со строковой интерполяцией Scala и Kotlin.