Доступ к переменным в фидере Gatling с gRPC - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать полезную нагрузку gRP C, считывая данные из файла csv (в нем есть guestID и категория в виде столбцов). Я последовал примеру здесь https://github.com/phiSgr/gatling-grpc/blob/244ab372da6773102d79c65a7e4086f409d3fe94/src/test/scala/com/github/phisgr/example/GrpcExample.scala, но я вижу ошибку несоответствия типов при попытке сделать то же самое. (он ожидает Seq [ContextKey], но здесь я могу сформировать Seq [Expression [ContextKey]])

val scn2: ScenarioBuilder = scenario("gRPC call - 50 users repeated 100 times")
  .feed(csv("testtext.csv"))
  .exec(
    grpc("gRPC request with test message")
      .rpc(RecommenderGrpc.METHOD_GET_RECOMMENDATIONS)
      .payload(RequestContext.of(Map("test" -> "test"),
        Seq(ContextKey.defaultInstance.updateExpr(
          _.id :~ $("guestID"),
          _.`type` :~ Type.GUEST
        ), ContextKey.defaultInstance.updateExpr(
          _.id :~ $("category"),
          _.`type` :~ Type.CATEGORY
        )),
        Seq())
      )
  )

(полезная нагрузка - это объект RequestContext, который принимает метаданные, ключи и элементы. Метаданные - это карта , keys - это Seq для ContextKey, а элементы - пустые (Seq. ContextKey содержит строку guestID или категорию и тип).

Как использовать переменные в фидере здесь?

1 Ответ

1 голос
/ 03 апреля 2020

Перейти к основанию для решения.


Expression[T] является псевдонимом для Session => Validation[T]. В простом Engli sh это функция, которая создает полезную нагрузку из сеанса с возможностью сбоя.

Можно считать, что Expression[T], абстрактно, «содержит» a T.


Как, например, Promise в JavaScript «содержит» будущее значение. Вы не можете присвоить Promise из T функции, которая ожидает T. Если кто-то хочет преобразовать или объединить Promise s, этот код нужно вывернуть наизнанку и предоставить в качестве аргумента .then. 1

aPromise + 1 // wrong
aPromise.then(a => a + 1)

Это та же причина, по которой ваш пример кода не компилируется.


Пользователи Gatling не обязательно знакомы с Scala или с функциональным программированием в целом. Это будет контрпродуктивно, чтобы заставить их понять этот «оберточный» материал. 2 Так что есть код, который поможет вам объединить Expression s.

Для HTTP и других нетипизированных вещей, EL string анализируется и преобразуется в Expression под капотом.

Сообщения Protobuf строго типизированы, полезная нагрузка не может быть легко построена с использованием строковой интерполяции. Таким образом, операторы :~ на линзах используются для обработки сантехники, поэтому вам не нужно вручную обрабатывать Expression упаковку.


Но теперь у вас есть функция RequestContext.of, которая строит полезную нагрузку. Объектив magi c не может помочь, если вам нужна эта функция. Вы должны написать Expression лямбду самостоятельно. 3

.payload { session =>
  for {
    guestId <- session("guestId").validate[String]
    category <- session("category").validate[String]
  } yield RequestContext.of(
    Map("test" -> "test"),
    Seq(
      ContextKey(id = guestID, `type` = Type.GUEST),
      ContextKey(id = category, `type` = Type.CATEGORY)
    ),
    Seq()
  )
}

  1. Излишне говорить, что это очень громоздко, и люди теперь используют асин c -wait с Promise s.

  2. An Expression - это просто монада Either и монада Reader, собранные вместе, в чем проблема?

  3. Я могу написать версию с линзами, если я знаю, что делает RequestContext.of.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...