如何在调用另一个库(生成的 gRPC 代码)的 exec() 中传递 Gatling 会话属性?

How to pass Gatling session attributes in an exec() invoking another library (generated gRPC code)?

新手 Gatling+Scala 问题:我正在使用 George Leung 的 gatling-grpc 库(以 http 库为模型)并尝试从会话(在馈线中生成)传递一个值, 进入非 DSL、非 Gatling 方法调用,特别是调用填充 gRPC 有效负载对象。


在开始之前,让我补充一下,我似乎无法使用 exec 的 sessionFunction (Expression[T]) 形式,这将解决我的问题:

.exec{ session => { … grpc(…).rpc(…)… }}

...因为,AFAICT,grpc 调用必须是块中的最后一件事,否则它永远不会被评估...但它 不能 块中的最后一件事,因为无法将其强制为 return 会话对象(再次,AFAICT)。


因此,我必须使用 execActionBuilder 形式(grpc(...) returns a Call 所以这是设计的):

.exec( grpc(…).rpc(…)... )

这有效……直到我有一个 gRPC payload(即非 Gatling)方法调用,我需要向其传递一个非常量值(来自馈线) .

在这种情况下,我无权访问 Session 对象,并且没有应用 Gatling 表达式语言,因为定义我需要使用(以生成有效负载)的 gRPC 类型的库不知道加特林机。

所以,在这个片段中:

  .header(transactionIdHeader)("${tid}.SAVE") 
  .payload(Student.newBuilder()
    .setId(GlobalId.newBuilder().setValue("${authid}_${uniqId}").build()).build())
  )

...第一次调用评估 ${tid} 因为第二个参数中的参数是 Expression[T],因此被评估为表达式语言,但第二次调用无法评估 ${authid}${uniqId} 因为定义 gRPC 类型 GlobalId 的外部生成库不了解 Gatling。

所以...

  1. 有没有办法在 Gatling 的 DSL 之外调用 EL?
  2. 或者通过 ActionBuilder 访问 Session 对象的方法?
    • (当我使用 sessionFunction 形式时,我看到 Gatling 代码神奇地找到了一个 Session 对象,但我看不出它是从哪里来的——即使查看字节码也没有说明)
  3. 或者,回到 execExpression[T] 形式,有没有办法让 ActionBuilder return 成为 Session 对象?
  4. 或者,仍然是 Expression[T] 形式,如果我有办法确保 grpc()... 表达式被计算(命令式编程)。

加特林 3.3.1,斯卡拉 2.12.10

gatling-grpc 库位于 phiSgr/gatling-grpc;我正在使用版本 0.7.0 (com.github.phisgr:gatling-grpc)。

(当然,gRPC Java 代码是从 .proto 文件生成的。)

您需要 Gatling-JavaPB 集成。

要查看实际效果,请参阅 here


.payload 方法采用 Expression[T],对于 Session => Validation[T]an alias。用简单的英语来说,这是一个从会话中构造有效载荷的函数,可能会失败。

您的大部分挫败感是因为不知道如何获得 Session。我希望这能消除困惑。


在最坏的情况下,可以write a lambda to create an expression. But for string interpolation or accessing one single object, Gatling provides an implicit conversation将 EL String 变成 Expression

问题是您想要构建类型良好的有效载荷,而 Gatling 的 EL 对此无能为力。建造者的二传手想要一个 T,但你只有一个 Expression[T](来自 EL 或 $ function)。上面提到的库是为处理该管道而创建的。


导入后com.github.phisgr.gatling.javapb._,应该写成下面的内容

...
.payload(
  Student.getDefaultInstance
    .update(_.getIdBuilder.setValue)("${authid}_${uniqId}")
)

为了完整起见,请参阅 warning in Gatling's documentation 以了解为什么在 .exec(sessionFunction) 中定义操作不起作用。