使用gRPC在加特林进纸器中访问变量

问题描述 投票:0回答:1

我正在尝试通过从csv文件中读取数据来创建gRPC有效负载(它具有guestID和category作为列)。我在此处按照示例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对象,它接收元数据,键和项。元数据是一个映射,键是ContextKey的Seq,而项是空的Seq。ContextKey包含字符串guestID或类别和类型)。

如何在此处使用供稿器中的变量?

scala grpc gatling scala-gatling
1个回答
0
投票

跳到底部寻找解决方案。


Expression[T]Session => Validation[T]的别名。用简单的英语来说,这是一个从会话构造有效负载的函数,可能会失败。

您可以考虑将Expression[T]抽象包含在T中。


就像JavaScript中的Promise如何“包含”将来的值。您不能将PromiseT赋予期望T的功能。如果要转换或组合Promise,则必须将该代码内翻,并作为.then的参数提供。1

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

这与您的代码示例无法编译的原因相同。


加特林的用户不一定熟悉Scala或一般的函数式编程。使他们理解这种“包装”的东西会适得其反。2因此,有一些代码可以帮助您组合Expression

对于HTTP和其他未类型化的内容,将EL string解析并转换为幕后的Expression

Protobuf消息是强类型的,使用字符串插值无法轻松构造有效负载。因此,镜头上的:~运算符用于处理管道,因此您不必手动处理Expression包装。


但是现在您有了一个函数RequestContext.of,该函数构造了有效负载。如果需要此功能,镜头魔术将无济于事。您必须自己编写Expression lambda。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. 不用说这非常麻烦,现在人们将异步等待与Promise一起使用。

  2. Expression只是Either单子和Reader单子堆叠在一起,出了什么问题?

  3. [如果我知道RequestContext.of的功能,我也许可以编写带镜头的版本。

© www.soinside.com 2019 - 2024. All rights reserved.