我正在尝试通过从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或类别和类型)。
如何在此处使用供稿器中的变量?
跳到底部寻找解决方案。
Expression[T]
是Session => Validation[T]
的别名。用简单的英语来说,这是一个从会话构造有效负载的函数,可能会失败。
您可以考虑将Expression[T]
抽象包含在T
中。
就像JavaScript中的Promise
如何“包含”将来的值。您不能将Promise
的T
赋予期望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()
)
}
不用说这非常麻烦,现在人们将异步等待与Promise
一起使用。
Expression
只是Either
单子和Reader
单子堆叠在一起,出了什么问题?
[如果我知道RequestContext.of
的功能,我也许可以编写带镜头的版本。