#gatling #scala-gatling
#gatling #scala-gatling
Вопрос:
У меня есть следующий код
package lts
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class BankingSimulation extends BaseSimulation {
val paginateThroughCustomTransactionsView = scenario("Scenario 04: Paginate through custom transactions view")
.feed(csv("scenario04.csv").circular)
.exec(http("04_paginateThroughCustomTransactionsView")
.get("/api/savings/transactions?viewfilter=${viewEncodedkey}amp;offset=0amp;limit=50")
.header("accept", "application/json")
.check(jsonPath("$..encodedKey").saveAs("myEncodedKey"))
)
.asLongAs("${myEncodedKey.exists()}","offsetCounter", exitASAP = false) {
exec(http("04_paginateThroughCustomTransactionsView")
.get("/api/savings/transactions?viewfilter=${viewEncodedkey}amp;offset=${offsetCounter}amp;limit=50")
.header("accept", "application/json")
.check(jsonPath("$..encodedKey").saveAs("myEncodedKey"))
)
}
setUp(
paginateThroughCustomTransactionsView.inject(incrementConcurrentUsers(1).times(1).eachLevelLasting(1))
).protocols(httpProtocol)
}
Прямо сейчас сценарий работает, но offsetCounter увеличивается на 1 каждый раз. Как я могу увеличить его на 50?
Ответ №1:
возможно, более приятный способ … не полагаться на счетчик циклов и использовать вместо него фидер
var offsetFeeder = (50 to 1000 by 50).toStream.map(i => Map("offsetCounter" -> i)).toIterator
затем внутри вашего .Как длинный блок, просто
.feed(offsetFeeder)
и выполнить ваш вызов «04_paginateThroughCustomTransactionsView»
Комментарии:
1. Это тоже здорово, но, к сожалению, мне нужно, чтобы тест выполнялся на основе времени, а не ограничения. Но это определенно поможет мне где-нибудь еще: D Спасибо!
2. разве вы не просто выполняете цикл, пока не получите результат для myEncodedKey?
3. Ну, вроде того… Это скорее проверка работоспособности данных. ~ 1 миллион закодированных ключей для разбиения на страницы. Для прохождения всего требуется несколько часов, но меня больше интересует настройка 30 миллионов тестов для каждой новой версии приложения.
4. если вы хотите выполнять цикл в течение конечного периода времени, вы можете сделать это с помощью scala finiteDuration . например:
.exec(session => session.set("timeout", 3 hours.fromNow)) .asLongAs(session("timeout").as[Deadline].hasTimeLeft) {...}
5. Я еще не перешел на gatling 3, но я вижу, что теперь у него есть встроенная поддержка для такого рода вещей
Ответ №2:
Хорошо, по-видимому, вы можете выполнять все виды операций с сеансом. Перед выполнением вызова ( exec
) в .asLongAs
части, вы должны
exec {session =>
val offsetCounter = session("counter").as[Int] * 50
session.set("offsetCounter", offsetCounter)
}
таким образом, код становится
val paginateThroughCustomTransactionsView = scenario("Scenario 04: Paginate through custom transactions view")
.feed(csv("scenario04.csv").circular)
.exec(http("04_paginateThroughCustomTransactionsView")
.get("/api/savings/transactions?viewfilter=${viewEncodedkey}amp;offset=0amp;limit=50")
.header("accept", "application/json")
.check(jsonPath("$..encodedKey").saveAs("myEncodedKey"))
)
.asLongAs("${myEncodedKey.exists()}","counter", exitASAP = false) {
exec {session =>
val offsetCounter = session("counter").as[Int] * 50
session.set("offsetCounter", offsetCounter)
}
.exec(http("04_paginateThroughCustomTransactionsView")
.get("/api/savings/transactions?viewfilter=${viewEncodedkey}amp;offset=${offsetCounter}amp;limit=50")
.header("accept", "application/json")
.check(jsonPath("$..encodedKey").saveAs("myEncodedKey"))
)
}