Я пытаюсь установить / обеспечить выполнение соглашений об уровне обслуживания на конечных точках для службы.В некоторых тестах есть шаг создания, при котором учетная запись создается с помощью вызова API.Шаг создания может занять секунду или две.Я пытаюсь измерить / установить утверждения о производительности GET (~ 50 мс), не включая время для создания (1-2 сек).
Использование файлов статических фидеров с жестко закодированными идентификаторами не является идеальным, поскольку мы хотели бы иметь возможность запускать тест в переходных средах, и мы хотели бы избежать предположения о хрупкости: 1) aконкретная учетная запись существует 2) ни один другой процесс не вмешивался в нее
Подход, который я рассматриваю, - настроить фидер, который создает учетную запись и затем вызывает файл функции.Фидер может использовать API Java для вызова файла объекта для создания учетной записи, но я не уверен, как передать идентификатор созданной учетной записи в метод GET.Могу ли я использовать сессию Гатлинга для этого?(В этой части мне больше всего нужна помощь)
Вопросы, на которые я могу ответить экспериментально после того, как смогу передать идентификатор учетной записи:
Я также не уверен, что задержка ответа на созданиехорошо играет с питателями Гатлинга - приведет ли это к провалу симуляции?Неужели время для фидера создать учетную запись исключено из моделирования?.
Как я в данный момент выполняю симуляции (пока не с фидерами)
class FooSimulation extends AbstractSim {
override def urlPattern: String = "api/foo"
override def karateFeaturePath: String = "classpath:foo.feature"
}
import com.intuit.karate.gatling.PreDef.{pauseFor, _}
import io.gatling.core.Predef.{global, _}
import scala.concurrent.duration._
abstract class AbstractSim extends Simulation {
def secondMillis = 1000
def urlPattern: String
def karateFeaturePath: String
def successThreshold = 99
def simulationUsers = 20
def simulationDurationSeconds = 20
def percentiles: (Int, Int, Int, Int) = { ( 2 * secondMillis, 3 * secondMillis, 4 * secondMillis, 5 * secondMillis) }
val protocol = karateProtocol(
urlPattern -> Nil,
urlPattern -> pauseFor("get" -> 0, "post" -> 0)
)
protocol.nameResolver = (req, ctx) => req.getHeader("karate-name")
val theScenario = scenario(this.getClass.getName).exec(karateFeature(karateFeaturePath))
val (p1, p2, p3, p4) = percentiles
setUp(
theScenario.inject(rampUsers(simulationUsers) over (simulationDurationSeconds seconds)).protocols(protocol),
).assertions(
List(
global.successfulRequests.percent.gte(successThreshold)
, global.responseTime.mean.lte(p1)
, global.responseTime.percentile1.lte(p1) //50th %
, global.responseTime.percentile2.lte(p2) //75th %
, global.responseTime.percentile3.lte(p3) //95th % //first request may require a cache rebuild which can take 2+ secs
, global.responseTime.percentile4.lte(p4) //99th % //first request may require a cache rebuild which can take 2+ secs
)
)
}