Я новичок в Гатлинге и Скале, и мне нужен ваш совет.
Я хотел бы получить нагрузочный тест для n-пользователей. Каждому пользователю необходимо отправить запрос на создание разных учетных записей. Это получается отправкой файла json с соответствующим массивом объектов (в нашем случае это «записи»).
Каждый пользователь должен отправить свой логин, так как наша бэкэнд-система проверяет уникальность имени пользователя. Так или иначе, мы должны быть уверены, что Гатлинг посылает разные данные для каждого виртуального пользователя, а также для каждой записи.
Мы заметили, что используется элемент сеанса, который представляет состояние виртуального пользователя. Проблема в том, что приведенный ниже код не будет работать, поскольку структура Exec, используемая с функцией выражения, не отправляет никаких запросов.
Есть раздел, который может работать, но я не знаю, как определить третий параметр, чтобы отличить виртуальный идентификатор пользователя. Ниже приведена простая структура файла json, используемая для этого теста
{
"entries": [
{
"userName": "some user name",
"password": "some password"
}
}
и скала код с моими комментариями
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class UserCreationTest extends Simulation {
val profilesNumber = 2
val virtualUsers = 2
val httpConf = http
.baseURL("some url")
.acceptHeader("application/json")
.basicAuth("username", "password")
// This method will multiply 'entries' section in JSON 'entriesNumber' times
def createJsonUserEntries(entriesNumber: Int, users: List[String], userId : Long): String = {
val header = """{"entries": ["""
val footer = """]}"""
val builder = StringBuilder.newBuilder
for (i <- 0 until entriesNumber) {
val userIndex = (userId.toInt - 1) * entriesNumber + i
val userName = users(userIndex).get
val apiString =
s"""{
"userName": "${userName}"
"password": "password"
}"""
builder.append(apiString)
if (i != entriesNumber) {
builder.append(",")
}
}
header + builder.toString() + footer
}
// We do have method for generating user names based on profilesNumber and virtualUsers variables
// but for sake of this example lets hardcode 4 (profilesNumber * virtualUsers) user names
val usersList = List("user-1", "user-2", "user-3", "user-4")
//This will throw exception as no request was send. According to documentation function block is used to debugging/editing session
val scn = scenario("Create WiFi User Profile")
.exec(session => {
http("CreateUserProfile")
.post("/userProfiles/create/")
.body(StringBody(
createJsonUserEntries(profilesNumber, userslList, session.userId).toString
)
).asJSON
session})
// This exec block will send a request but I do not know how to determine third param that should be virtual user Id
// To run this section please comment previous whole scenario block
/*
val scn = scenario("")
.exec(http("CreateUserProfile")
.post("/userProfiles/create/")
.body(StringBody(
createJsonUserEntries(profilesNumber, emailList, ???).toString
)
).asJSON
)
*/
setUp(scn.inject(atOnceUsers(virtualUsers)).protocols(httpConf))
}
Не могли бы вы помочь мне в этом, пожалуйста? Есть ли другой способ сделать это в Гатлинге? Заранее большое спасибо